home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 22 / Cream of the Crop 22.iso / program / abc9611.zip / ABC9611.CDE next >
Text File  |  1996-11-01  |  814KB  |  1 lines

  1. Nathan Wittich                 PSYCHIC-OLOGIST                wittich@cdsnet.net             09-18-96 (18:27)       QB, QBasic, PDS        76   3240     PSYCHIC.BAS DATA "what does that make you think?"πDATA "have you thought much about the end result of that?"πDATA "maybe we should talk about something else."πDATA "you realize I only listen to you since it's my job. But go on."πDATA "if that's entirely true, you would have made more of a point."πDATA "pretending you are your guardian angel, tell me your opinion."πDATA "what if you were to walk off a cliff today?"πDATA "are you aware of your surroundings much?"πDATA "if you were, you'd understand I might not be"πDATA "time for you to get a break for a while."πDATA "how come you always say dumb responses?"πDATA "You come here to share your problems with me."πDATA "Is there something I should know?"πDATA "maybe you should tell me things in more detail."πDATA "Is that really the reason?"πDATA "do you even trust me?"πDATA "It's OK. I understand. It's my job to understand. My job is to help you."πDATA "more secrets, less mumbo-jumbo, OK."πDATA "I don't know why I even try. Wait, I do, It's my job."πDATA "Is there something you'd rather be talking about?"πDATA "I look like this :-) but even us psychologists lie."πDATA "You know what I think?"πDATA "There was a cat that wore a hat and sat on mat and it was fat and that was that."πDATA "You need a vacation."πDATA "There's a pot of gold at the end of every rainbow."πDATA "When is groundhog day?"πDATA "You need to look at the big picture."πDATA "what was accomplished?"πDATA "You should be more assertive"πDATA "You should finish something"πDATA "Don't you even pay attention to your instincts? They're there to help you."πDATA "You don't understand how others see you"πDATA "What's your ultimate goal?"πDATA "You tend to concentrate too much on one thing and forget another thing: Comb hair, ignore teeth. You're nice, but think too fast..."πDATA "Do you try many new things?"πDATA "Want my advice? Take a philosphy class."πDATA "I think your dog understands you better than most people."πRANDOMIZE TIMERπt = RND * 100 'all this weird random number stuff is neccesary because πd = RND * 10 'it seems to say the same thing and then another one a lot if you don'tπi = TIMER * RNDπRANDOMIZE TIMER + d + RND * 10πFOR u = 1 TO RND * 100: j = RND * 5: NEXTπRANDOMIZE t + TIMERπCLSπDIM n$(200)πFOR a = 1 TO 37πREAD n$(a)πNEXT aπPRINT "hello. Welcome to psychic-ologist by Nathan Wittich"πPRINT "This 'Artificial inteligence' will talk to you. Note: if something"πPRINT "doesn't directly make sense, It may be sort of symbolic or something."πPRINTπPRINT "Also, you have to act human for me to act human. For example, if"πPRINT "a human says something twice, you say 'you already said that' not"πPRINT " 'you're stupid'."πPRINTπPRINT "Also note: you don't have to answer."πINPUT "", a$πPRINT "Look! A duck!"πDOπCOLOR 8 + RND * 7πLINE INPUT "", a$πCOLOR 1 + INT(RND * 8)π40 g$ = n$(1 + INT(RND * a))πIF INSTR(h$, g$) > 0 THEN GOTO 40πIF LEN(h$) > 1000 THEN h$ = MID$(h$, 50)πh$ = h$ + g$πPRINT g$πFOR f = 1 TO d: NEXTπLOOPππ' this program was written by Nathan Wittich wittich@cdsnet.netπ' I've had some pretty long conversations with it.π' When you run it, it will seem like it always picks the right phrase π' randomly.πSteve Horstmeyer               CALCULATE WIND CHILL           Internet                       10/95 (00:00)          QB, QBasic, PDS        153  4975     WINDCHL.BAS 'BASIC LANGUAGE PROGRAM TO CALCULATE WIND CHILL BASED ON SIPLE FORMULAπ' WEATHERWISE MAGAZINE OCTOBER/NOVEMBER 1995 BY STEVE HORSTMEYERπ'RUNS UNDER DOS v5.x & V6.x QBASIC, OR QUICKBASIC OR QUICKBASIC EXTENDED.π'THIS PROGRAM WILL NOT RUN UNDER OLDER VERSIONS OF GWBASIC, BASIC OR BASICAπ'FROM DOS V4.X OR EARLIER. LINE NUMBERS ARE NOT REQUIRED IN QBASIC, WHEREπ'NEEDED A LINE CAN HAVE A LABEL LIKE CHOOSEMODE: ONEWCHILL: AND TABLE: BELOW.ππDIM WTABLE(11, 13), TEMPS(13), WIND(11)πCLSπ'DEF FNWCT defines a function that calculates wind chill using  the Sipleπ'formula. Statement IF VEL<=4 sets wind chill to temp if wind is <=4mph.π'to de-activate add 'to make lie a comment, result is roundedππDEF FNWCT (VEL, TMP)π  WC = .0817 * (3.71 * (VEL ^ .5) + 5.81 - .25 * VEL) * (TMP - 91.4) + 91.4π  IF VEL <= 4 THEN WC = TMPπ  FNWCT = CINT(WC)πEND DEFππCLSπLOCATE 2, 9: COLOR 14, 0: PRINT "BASIC LANGUAGE PROGRAM TO CALCULATE WIND CHILL USING SIPLE FORMULA"πLOCATE 5, 20: PRINT "REQUIRES MS-DOS (V5.X OR HIGHER) QBASIC "πLOCATE 6, 21: PRINT "OR QUICKBASIC OR QUICK BASIC EXTENDED"πLOCATE 7, 27: PRINT "WEATHERWISE NOVEMBER 1995"πLOCATE 8, 30: PRINT "BY STEVE HORSTMEYER"πLOCATE 10, 34: COLOR 31, 0: PRINT "PRESS ANY KEY"πWHILE INKEY$ = "": WENDπππ'*****determine if user wants a single value or table*****πCHOOSEMODE:π  CLS : COLOR 7, 0π  LOCATE 3, 1: PRINT "TO CALCULATE A SINGLE VALUE PRESS S "π  LOCATE 5, 1: PRINT "TO DISPLAY A TABLE PRESS T "π  INPUT MODE$: MODE$ = UCASE$(MODE$)π  SELECT CASE MODE$π         CASE "S"π            GOSUB ONEWCHILLπ         CASE "T"π            GOSUB TABLEπ         CASE ELSEπ            GOTO CHOOSEMODEπ  END SELECTπENDπ'*******************SUBROUTINES*****************π'*****find  single windchill*****πONEWCHILL:π  CLS : COLOR 7, 0π  LOCATE 2, 1: INPUT "ENTER TEMPERATURE (F)        "; T: T = CINT(T)π  LOCATE 4, 1: INPUT "ENTER WIND VELOCITY (MPH)    "; V: V = CINT(V)π  IF V < 0 THENπ     CLS : LOCATE 1, 1: COLOR 30, 0π     PRINT "WIND VELOCITY MUST BE POSITIVE"π     COLOR 30, 0π     PRINT "TO START AGAIN PRESS ANY KEY"π     WHILE INKEY$ = "": WENDπ     GOTO ONEWCHILLπ  END IFππ  CLSπ  LOCATE 2, 1: PRINT "WIND CHILL BASED ON SIPLE FORMULA"π  LOCATE 4, 1: PRINT "TEMPERATURE   "; T; "F AND"π  LOCATE 6, 1: PRINT "WIND VELOCITY "; V; "MPH"π  COLOR 9, 0: LOCATE 8, 1: PRINT "WIND CHILL = "; FNWCT(V, T); " F"ππREPEAT:π  LOCATE 12, 1: COLOR 14, 0: INPUT " ANOTHER S, RESTART R OR EXIT E "; AGAIN$π  AGAIN$ = UCASE$(AGAIN$)π  SELECT CASE AGAIN$π         CASE "S"π            GOTO ONEWCHILLπ         CASE "R"π            GOTO CHOOSEMODEπ         CASE "E"π            ENDπ         CASE ELSEπ            GOTO REPEATπ  END SELECTπRETURN: '*****end of subroutine to calculate single value*****π'*****calculate and display table*****πTABLE:π  CLSπ  LOCATE 3, 1: PRINT "ENTER MINIMUM TEMPERATURE (FOR >80 PROGRAM DEFAULTS TO 80)"π  LOCATE 5, 1: PRINT "TABLE WILL BE CALCULATED FOR 5 DEGREE INCREMENTS"π  LOCATE 7, 1: PRINT "WIND SPEEDS ARE FIXED FROM ZERO TO 45 MPH IN 5 MPH INCREMENTS"π  LOCATE 9, 1: COLOR 30, 0: PRINT "PRESS ANY KEY TO CONTINUE"π  WHILE INKEY$ = "": WEND: COLOR 14, 0ππ  LOCATE 12, 1: INPUT "ENTER LOWEST TEMPERATURE F"; MNTEMPπ  MNTEMP = CINT(MNTEMP): COLOR 7, 0π  IF MNTEMP > 80 THEN MNTEMP = 80ππ  FOR V = 0 TO 50 STEP 5π  WINDEX = V / 5: WIND(WINDEX) = V: TINDEX = 0π  FOR T = MNTEMP TO MNTEMP + 60 STEP 5π  TEMPS(TINDEX) = Tπ  WTABLE(WINDEX, TINDEX) = FNWCT(V, T): TINDEX = TINDEX + 1π  NEXT T: NEXT Vππ'*****display table on screen*****πWRITETABLE:π  CLS : COLOR 14, 0π  LOCATE 2, 2: PRINT "WIND": LOCATE 2, 33: PRINT "AIR TEMPERATURE"π  FOR I = 0 TO 12π  PRINT TAB(10 + I * 5); TEMPS(I);π  NEXT Iππ  LOCATE 3, 3: PRINT "VEL": COLOR 7, 0π  FOR I = 2 TO 4π  LOCATE I, 9: PRINT "|"π  NEXT Iππ  LOCATE 4, 10: PRINT STRING$(70, "="): LOCATE 3, 10π   π  FOR ROW = 0 TO 9π  LOCATE 2 * ROW + 5, 4π  COLOR 14, 0: PRINT WIND(ROW)π  COLOR 7, 0: LOCATE 2 * ROW + 5, 9: PRINT "|"ππ  FOR COLUMN = 0 TO 12: COLOR 15, 0π  SELECT CASE WTABLE(ROW, COLUMN)π         CASE IS > TEMPS(COLUMN)π            IF WTABLE(ROW, COLUMN) > 120 THENπ                COLOR 4, 0π                ELSE COLOR 12, 0π            END IFπ        CASE 11 TO 32π            COLOR 1, 0π         CASE -20 TO 10π            COLOR 9, 0π         CASE -49 TO -21π            COLOR 13, 0π         CASE IS <= -50π            COLOR 29, 0π  END SELECTππ  LOCATE 2 * ROW + 5, 10 + COLUMN * 5: PRINT WTABLE(ROW, COLUMN)π  LOCATE 2 * ROW + 6, 9: COLOR 7, 0: PRINT "|";π  NEXT COLUMN: NEXT ROWππ  COLOR 14, 0π  LOCATE 25, 1: INPUT "PRESS <R> TO RESTART PRESS <E> TO EXIT "; RERUN$π  RERUN$ = UCASE$(RERUN$)π  SELECT CASE RERUN$π         CASE "E"π            CLSπ            ENDπ         CASE "R"π            GOTO CHOOSEMODEπ         CASE ELSEπ            GOTO WRITETABLEπ  END SELECTπRETURN: '*****end of table subroutine*****πKurt Kuzba                     IMPORT ANSI INTO BASIC FUNCTIONFidoNet QUIK_BAS Echo          10-06-96 (08:23)       QB, QBasic, PDS        65   3210     ANSIFUNC.BAS'>   ansi for a menu in a quickbasic program without havingπ'>   the ansi in a seperate file that has to be loaded andπ'>   without ansi.sys loaded. Is this possible?π'>...........π'   Yes. It is. This will put the .ANS into code, and, inπ'another message, I post an ANSI interpreter. It should be next.ππ '|======================  begin ANSIFUNC.BAS  =======================|π '|  This is a QBasic program to convert an ANSI file to a QBasic     |π '|  FUNCTION that will return the file as a string. In the program   |π '|  this program produces, the function is called and the resulting  |π '|  string is output to CONSOLE, which requires ANSI.SYS loaded.     |π '|          Released to the Public Domain by Kurt Kuzba              |π '|===================================================================|π ' set error trap, set colors, clear screen, q$ = quote mark ==========πON ERROR GOTO Done: COLOR 2, 0: CLS : q$ = CHR$(34)π ' create a string for the input boxes  ===============================πi$ = STRING$(16, " ") + STRING$(15, CHR$(29))π ' print message and get filename from user, open file for input ======πLOCATE 5, 10: PRINT "We will turn an ANSI file into a QBasic function"πLOCATE 6, 10: PRINT "which returns the entire ANSI file as a string."πLOCATE 8, 10: PRINT "Enter ANSI name [ EX. MYPIC.ANS ] ";πCOLOR 1, 7: PRINT i$; : INPUT "", ans$: COLOR 2, 0πIF ans$ <> "" THEN OPEN ans$ FOR INPUT AS #1:  ELSE GOTO Doneπ ' get name of function to create from user ===========================πLOCATE 10, 10: PRINT "Enter Function name [ EX. Pic1$ ] ";πCOLOR 1, 7: PRINT i$; : INPUT "", func$: COLOR 2, 0π ' make FUNCTION name and open file for input =========================πIF func$ = "" THEN GOTO DoneπIF RIGHT$(func$, 1) <> "$" THEN func$ = func$ + "$"πname$ = func$ + ".bas": OPEN name$ FOR OUTPUT AS #2π ' write QBasic FUNCTION to file ======================================πPRINT #2, "DECLARE FUNCTION "; func$; "()"πPRINT #2, "open "; q$; "CONS:"; q$; " FOR OUTPUT AS #1"πPRINT #2, "PRINT #1, "; func$πPRINT #2, "FUNCTION "; func$πPRINT #2, "t$ = "; q$; q$π ' process ANSI to create QBasic routine to construct string ==========πWHILE NOT EOF(1)π   WHILE NOT EOF(1)π      PRINT #2, "t$=t$+"; q$; : C$ = ""π      WHILE C$ <> CHR$(10) AND NOT EOF(1)π         C$ = INPUT$(1, #1)π         IF C$ = CHR$(13) THENπ            C$ = q$ + " + CHR$(13) + CHR$(10)" + CHR$(13) + CHR$(10)π         END IFπ         IF C$ <> CHR$(10) THEN PRINT #2, C$;π      WENDπ   WENDπWENDπ ' finish writing QBasic FUNCTION to file =============================πPRINT #2, q$πPRINT #2, func$; "=t$"πPRINT #2, "END FUNCTION"π ' done, tell user new program is ready, wait for key =================πLOCATE 12, 10: COLOR 10πPRINT "Your new program, "; name$; ", containing the FUNCTION"πLOCATE 13, 10: PRINT func$; ", to display "; ans$; ", is ready to test."πLOCATE 14, 10: PRINT "ANSI.SYS must be loaded for "; name$; " to work."πDone:  CLOSE 1: CLOSE 2: C% = 0: i$ = ""πWHILE i$ = ""π   C% = (C% + 1) AND 15: LOCATE 15, 10: COLOR C%: PRINT "Hit a Key"π   i$ = INKEY$πWEND: COLOR 2π '|  ===============  end ANSIFUNC.BAS  ==============================|πTony Jones                     LOADS 320X200X256 PCX IMAGES   arafel1@ix.netcom.com          09-17-96 (00:00)       ASIC                   244  4320     SHOWPCX.ASI REM -- Filename: SHOWPCX.ASIπREM -- Developed with ASIC 5.00πREM -- Description: Decodes and displays 320x200,256 color PCX imagesπREM -- Date: September 17,1996πREM -- Author: Tony JonesπREM -- E-Mail: arafel1@ix.netcom.comππREM -- Use in any way you wish, but give credit where credit is due. :-)πREM -- Compile with Extended Math on.ππREM -- Decodes a PCX file, fades the image in, waits for a key pressπREM -- and then fades the image out.ππREM -- Array's to hold the palette data.πDIM Red(256)πDIM Green(256)πDIM Blue(256)ππREM -- We parse the command line for the name of our PCX file.πFileName$=COMMAND$πFileName$=LTRIM$(FileName$)ππIF FileName$ = "" THENππ PRINTπ PRINT "USAGE: SHOWPCX <filename>, where filename is a 320x200, 256 color"π PRINT "PCX file with extension."π PRINTππ ENDππENDIFππREM -- Enter Mode 13hπSCREEN 13ππREM --  Open the fileπOPEN "R",1,FileName$ππREM -- Check to see if the file existπIF ERROR > 0 THENπ SCREEN 0π PRINTπ PRINT " Error opening ";π PRINT FileName$;π PRINT "!"π PRINTπ ENDπENDIFππREM -- Check to see if its a 320x200, 256 color PCX fileπREM -- The first byte should be 10, the second should be 5.πINPUT#1, Man$ BYTEπCheck = ASC(Man$)πIF Check <> 10 THENπ CLOSE 1π SCREEN 0π PRINTπ PRINT " Not a valid PCX file!"π PRINTπ ENDπENDIFππINPUT#1, Ver$ BYTEπCheck = ASC(Ver$)πIF Check <> 5 THENπ CLOSE 1π SCREEN 0π PRINTπ PRINT " Not a valid PCX file!"π PRINTπ ENDπENDIFππREM -- Set the palette to black so we can fade the image in later.πFOR Index = 0 TO 255π  OUT(&hex3c8,Index)π  OUT(&hex3c9,0)π  OUT(&hex3c9,0)π  OUT(&hex3c9,0)πNEXT IndexπππREM -- Load the palette.πREM -- Position the file pointer 768 bytes from the end of the file.πLENG& = FILELEN(FileName$)πLENG& = LENG& - 768&πTemp&=FILEPOS(1,LENG&)ππFOR Index = 0 TO 255π REM -- Get the red,green and blue valuesπ INPUT#1, R$ BYTEπ INPUT#1, G$ BYTEπ INPUT#1, B$ BYTEππ Red(Index) = ASC(R$)π Red(Index) = Red(Index) / 4π Green(Index) = ASC(G$)π Green(Index) = Green(Index) / 4π Blue(Index) = ASC(B$)π Blue(Index) = Blue(Index) / 4πNEXT IndexπππREM -- Position the file pointer 128 bytes from the startπTemp&=FILEPOS(1,128)ππREM -- Decode the PCX dataππCounter& = 0&πWHILE Counter& < 64000&ππ REM -- Get the dataπ INPUT#1, Dat$ BYTEππ REM -- See if this is a run.π ACode = ASC(Dat$)ππ IF ACode > 191 THENπ  REM -- How many bytes are in the run.π  NumBytes = ACode - 192ππ  REM -- Get the actual data for the runπ  INPUT#1, Dat$ BYTEπ  ACode = ASC(Dat$)ππ  REM -- Put the data on the screen NumBytes times.π  DEFSEG = &hexA000ππ  WHILE NumBytes > 0π   POKE Counter&,ACodeπ   Counter& = Counter& + 1&π   NumBytes = NumBytes - 1π  WENDππ  DEFSEG = -1ππ ELSEπ  REM -- Else just put the data on the screenπ  DEFSEG = &hexA000ππ  POKE Counter&,ACodeπ  Counter& = Counter& + 1&ππ  DEFSEG = -1ππ ENDIFππWENDππREM -- Close the fileπCLOSE 1ππREM -- Fade the image inπFOR Count = 0 TO 31ππ FOR Index = 0 TO 255ππ  OUT(&hex3c7,Index)π  TR = INP(&hex3c9)π  TG = INP(&hex3c9)π  TB = INP(&hex3c9)ππ  IF TR < Red(Index) THENπ   TR = TR + 2π  ENDIFππ  IF TG < Green(Index) THENπ   TG = TG + 2π  ENDIFππ  IF TB < Blue(Index) THENπ   TB = TB + 2π  ENDIFππ  OUT(&hex3c8,Index)π  OUT(&hex3c9,TR)π  OUT(&hex3c9,TG)π  OUT(&hex3c9,TB)ππ NEXT Indexπππ REM -- Delay for a while to make the fade smooth.π Thn& = TIMERπ Elapsed& = 0&π WHILE Elapsed& < 2&π  Now& = TIMERπ  Elapsed& = Now& - Thn&π  Elapsed& = ABS(Elapsed&)π WENDππNEXT CountππK$=""πREM -- Wait for a key press and then exitπWHILE K$=""π K$=INKEY$πWENDππREM -- Fade the image outπFOR Count = 0 TO 31ππ FOR Index = 0 TO 255ππ  OUT(&hex3c7,Index)π  TR = INP(&hex3c9)π  TG = INP(&hex3c9)π  TB = INP(&hex3c9)ππ  IF TR > 0 THENπ   TR = TR - 2π  ENDIFππ  IF TG > 0 THENπ   TG = TG - 2π  ENDIFππ  IF TB > 0 THENπ   TB = TB - 2π  ENDIFππ  OUT(&hex3c8,Index)π  OUT(&hex3c9,TR)π  OUT(&hex3c9,TG)π  OUT(&hex3c9,TB)ππ NEXT Indexππ REM -- Delay for a while to make the fade smooth.π Thn& = TIMERπ Elapsed& = 0&π WHILE Elapsed& < 2&π  Now& = TIMERπ  Elapsed& = Now& - Thn&π  Elapsed& = ABS(Elapsed&)π WENDππNEXT CountππREM -- Back to text modeπSCREEN 0ππENDπScott Turchin                  XOR ENCRYPTION                 nitehawk@tscnet.com            10-14-96 (23:58)       QB, QBasic, PDS        20   791      ENCRYPT.BAS 'This SUB is old by internet standards of encryption, and there are π'certain legalities for certain encryption methods due to a patent on π'some types of encryption. But this one utilizes the XOR and again, is π'old by internet standards, but EXCELLENT for encrypting strings inside π'an executable or a library (Registration purposes etc.) I've tested it π'with executable files and it will apparantly encrypt anything.π'PW$ is the password, if given again exactly the same as it was used to π'ENCRYPT St$, it will DECRYPT, otherwise it will re-ENCRYPT the St$πSUB ENCRYPT (PW$,St$) PUBLICπZ=0πtarget$=""πFOR Y=1 TO LEN(St$)π    A$=MID$(St$,Y,1)π    INCR Z,1π    IF Z > LEN(PW$) THEN Z=1π    B$=MID$(PW$,Z,1)π    Target$=Target$+CHR$(ASCII(A$) XOR ASCII(B$))πNEXTπSt$=Target$πEND SUBπAndrew K. Dart                 CONVERT UNIX TIME STAMP        FidoNet QUIK_BAS Echo          10-14-96 (17:32)       QB, QBasic, PDS        70   2436     UNIXTIME.BAS'Note:  My real name is Andrew K. Dart.  (Required by the rules!)ππ'I'm sure by now you've been flooded with replies to your question aboutπ'UNIX time stamps, where the date and time is represented by a longπ'integer indicating the number of seconds past midnight, 1/1/1970.π'I would have replied sooner, but there was ideal kite-flying weatherπ'yesterday!  Here's what I've pieced together for you:ππREM Program converts UNIX-style date code into day and time.πREM The date code is expressed in the number of seconds sinceπREM midnight, January 1, 1970.ππREM Written 10/14/96 by Andrew K. Dart         PUBLIC DOMAINπREM Provided as a public service, with no guarantees.πREM If you're still using UNIX after 12/31/99,πREM you'll need to make a few modifications.ππDIM LastDay(69 TO 99)πLastDay(69) = 0πFOR x = 70 TO 99π   LastDay(x) = 365 + LastDay(x - 1)π   IF x MOD 4 = 0 THEN LastDay(x) = LastDay(x) + 1πNEXT xππDIM mo(12)πFOR x = 1 TO 12π   READ mo(x)πNEXT xπDATA 0,31,59,90,120,151,181,212,243,273,304,334ππINPUT "What is the date code"; Code&πREM maximum allowable date code is LastDay(99) * 86400πREM which is 946,684,800 seconds after 00:00 on 1/1/70.ππDays = Code& \ 86400πFOR x = 70 TO 99π   IF Days <= LastDay(x) THEN EXIT FORπNEXT xπ'PRINT USING "Apparently this was sometime in 19##."; xππFOR y = 1 TO 11π   IF Days < (LastDay(x - 1) + mo(y + 1)) THENπ      PRINT "The date was "; STR$(y); "/";π      PRINT RIGHT$(STR$(100 + Days - LastDay(x - 1) - mo(y) + 1), 2);π      PRINT "/"; RIGHT$(STR$(100 + x), 2)π      EXIT FORπ   END IFπNEXT yππREM Now let's figure out what the time of day was:πRawSeconds = Code& MOD 86400πHour = RawSeconds \ 3600πMinute = (RawSeconds - (Hour * 3600)) \ 60πSecond = RawSeconds MOD 60πPRINT "The time was ";πPRINT USING "##:"; Hour;πPRINT RIGHT$(STR$(100 + Minute), 2); ":";πPRINT RIGHT$(STR$(100 + Second), 2)πENDππ'==============   END   ===============ππ'I presume that you do not want to account for Leap Seconds,π'because the computer clock (on the system running UNIX) probably doesπ'not count them.  However if you wanted to use a program like this toπ'figure the exact number of seconds between two times, on two differentπ'dates, you would need to find out whether one or more leap seconds hadπ'occurred between the two dates.   For details on leap seconds,π'E-Mail me atπ'               andrew.dart@chrysalis.orgπLuke Molnar                    SOUND BLASTER STARFIELD        Blood225@aol.com               09-01-96 (14:51)       QB, QBasic, PDS        311  12670    SBSTARS.BAS '*****************************************************************************π'*                                                                           *π'*   This program was written as a demonstration of using the MK Music       *π'*     Loader / Player in a program that does a moderate amount of           *π'*  calculations.  This is not designed to be the revolutionary graphics     *π'*                     demonstration or anything.                            *π'*                                                                           *π'*   This program was written by Molnar \ Kucalaba Productions in 1996       *π'*                                                                           *π'*             http://members.aol.com/mkwebsite/index.html                   *π'*                   ftp://users.aol.com/blood225/                           *π'*                                                                           *π'*****************************************************************************ππDECLARE SUB InitSong ()πDECLARE SUB Main ()πDECLARE SUB SBInit ()πDECLARE SUB PlayMusic ()πDECLARE SUB InitStars ()πDECLARE SUB CloseChannels ()πDECLARE SUB SetIns (Channel%)πDECLARE SUB WriteReg (Reg%, value%)πππCONST BasePort% = &H220  ' Change this for other sound cards.  It is mostπ                         ' likely 220h. (or 380h for Adlib)ππCLSπSCREEN 13ππ'$DYNAMICπRANDOMIZE TIMERππTYPE StarTypeπ X AS INTEGERπ y AS INTEGERπ Speed AS INTEGERπEND TYPEππDIM SHARED MaxChannel%, MaxNotes%πMaxChannel% = 3πCONST MaxPlay% = -1ππTYPE InsTypeπ MMult AS INTEGERπ MLevel AS INTEGERπ MAttack AS INTEGERπ MSustain AS INTEGERπ CMult AS INTEGERπ CLevel AS INTEGERπ CAttack AS INTEGERπ CSustain AS INTEGERπEND TYPEππTYPE ChannelTypeπ Defined AS INTEGERπ Speed AS SINGLEπ SongPtr AS INTEGERπ PStat AS SINGLEπ Octave AS INTEGERπ WaveForm AS INTEGERπ Flag AS INTEGERπ Flag2 AS INTEGERπ IsPlaying AS INTEGERπ IsDone AS INTEGERπEND TYPEππππDIM SHARED SongBuf(1 TO 790) AS INTEGERπDIM SHARED ChannelStat(1 TO 3) AS ChannelTypeπDIM SHARED Stars(100) AS StarTypeπDIM SHARED CurrentIns AS InsTypeπππ SBInitπ InitStarsπ InitSongπ  π   Mainππ SBInitπ SYSTEMππSongData:πDATA &HFD,&HFD,&HFD,&H28,&H14,&H28,&HFE,&HFE,&HFE,&H1,&H3,&H3,&HF,&HFF,&H44,&HFE,&H258,&H43,&H2,&H46,&HFD,&HF,&H46,&H14,&HFD,&H46,&H44,&H14,&H15,&H44,&HF,&H46,&H43,&H15,&HFE,&H44,&H46,&H4,&HFF,&H45,&H11,&H14,&HFF,&HFE,&H44,&H28,&H3,&H43,&H46,&HF,&HFF,&H45,&HFF,&H28,&HFF,&H64,&H44,&H14,&HF,&H44,&H46,&HF,&H44,&HFF,&HF,&HFD,&H14,&HF,&H28,&H45,&HF,&HFE,&HFD,&HF,&H3,&H28,&HF,&H44,&HFE,&HFF,&H43,&H1,&H64,&HFD,&HF,&HFE,&H14,&HFE,&H4,&H44,&H2,&H11,&H44,&HF,&H11,&H43,&HFD,&H12,&H44,&H14πDATA &HFF,&HFF,&HF,&H28,&H14,&H15,&H11,&H44,&H46,&H46,&H43,&H45,&H46,&HFF,&HFF,&H46,&H28,&H28,&H46,&H44,&H46,&H46,&H44,&H45,&H46,&H44,&HFF,&H46,&HFD,&H14,&H46,&H28,&H46,&H46,&HFE,&HFF,&H46,&H3,&H14,&HFD,&H44,&H45,&HC8,&H43,&HFD,&H12,&HFD,&H28,&HFD,&H14,&HFE,&H14,&H44,&H1,&H11,&H44,&HF,&H11,&H43,&HFE,&H12,&H44,&H2,&H11,&HFF,&HF,&HF,&H14,&HFD,&HF,&H44,&H14,&HFF,&H43,&HF,&H12C,&HFF,&H15,&HFD,&H28,&H46,&H28,&H44,&H45,&HFE,&H44,&HFF,&H3,&H44,&H28,&HF,&HFD,&H46,&HF,&H28,&H45,&HFF,&HFE,&HFF,&H14πDATA &H3,&H14,&HFD,&H44,&H46,&H14,&H43,&HFF,&HFE,&HFD,&H14,&H4,&H14,&H45,&H12,&H44,&HFD,&H46,&H44,&H28,&H12,&H43,&HFE,&H11,&H44,&H1,&H12,&HFF,&HF,&H46,&H14,&HFE,&H12,&H44,&H2,&H11,&H43,&HF,&H12,&HFF,&HFD,&H46,&H28,&H14,&H12,&H44,&HF,&H11,&H44,&H15,&H12,&H44,&H46,&H46,&HFD,&HF,&H12,&H28,&HFF,&H11,&HFE,&H14,&HFE,&H3,&HF,&H4,&H44,&HFF,&HFD,&H43,&H14,&HA,&HFD,&H46,&HF,&H14,&H15,&H15,&H44,&HFF,&H46,&H44,&H14,&HF,&H43,&HF,&H15,&H44,&HFF,&H46,&HFF,&H14,&HF,&H14,&HFD,&H15,&H44,&H28,&H46,&H43πDATA &HFE,&HF,&HFF,&H2,&H15,&H28,&H12,&H46,&H44,&HFE,&HF,&H44,&H3,&H15,&H44,&H12,&H46,&HFD,&HFD,&HF,&H28,&H14,&H15,&HFE,&H12,&H46,&H3,&H11,&H12,&H44,&HFE,&H11,&H43,&H2,&H12,&HFD,&HF,&HFE,&H14,&H15,&H3,&H44,&HFF,&HF,&H44,&H28,&HFF,&H43,&HF,&H14,&H44,&H15,&HF,&HFF,&HFF,&H15,&H14,&H14,&H46,&H44,&HF,&H12,&H43,&HFF,&H46,&HFF,&H14,&HF,&H28,&H15,&HFF,&H44,&HFD,&H14,&H44,&H28,&HFE,&H44,&HFE,&H5,&HFD,&H2,&H12,&H28,&H12,&H12,&HFE,&HFE,&H12,&H3,&H3,&H12,&H44,&H12,&H12,&H43,&HFD,&H12,&HFD,&H14πDATA &H12,&H14,&H12,&H12,&H44,&H11,&HFD,&H44,&HFE,&H64,&H43,&H2,&H12,&H44,&HF,&HFF,&HFF,&HFE,&H3C,&H14,&H3,&HFB,&H44,&H12,&H0,&H43,&HFF,&H0,&HFF,&H14,&H0,&H28,&H12,&H0,&H44,&HFF,&H0,&H44,&H14,&H0,&H44,&HFE,&H0,&HFD,&H2,&H0,&H28,&HF,&H0,&HFE,&HFE,&H0,&H3,&H3,&H0,&H44,&H11,&H0,&H43,&HFF,&H0,&HFD,&H14,&H0,&H14,&H12,&H0,&H44,&HFF,&H0,&H44,&H14,&H0,&H43,&HFD,&H0,&H44,&H28,&H0,&HFF,&HFE,&H0,&H14,&H1,&H0,&H44,&HF,&H0,&H43,&HFE,&H0,&HFF,&H2,&H0,&H28,&HF,&H0,&H44,&HFD,&H0πDATA &H44,&H14,&H0,&H44,&HF,&H0,&HFD,&H15,&H0,&H28,&H46,&H0,&HFE,&HF,&H0,&H3,&HFF,&H0,&H44,&H14,&H0,&H43,&HF,&H0,&HFD,&HFF,&H0,&H14,&H14,&H0,&H44,&H46,&H0,&H44,&H15,&H0,&H43,&HFF,&H0,&H44,&H14,&H0,&HFF,&HF,&H0,&H14,&HFF,&H0,&H44,&H14,&H0,&H43,&HFD,&H0,&HFF,&H28,&H0,&H28,&HFE,&H0,&H44,&H2,&H0,&H44,&H46,&H0,&H44,&HFE,&H0,&HFD,&H3,&H0,&H28,&H46,&H0,&HFE,&HFD,&H0,&H3,&H14,&H0,&H44,&H46,&H0,&H43,&H12,&H0,&HFD,&HFE,&H0,&H14,&H2,&H0,&H44,&H43,&H0,&H44,&HFE,&H0,&H43πDATA &H3,&H0,&H44,&H46,&H0,&HFF,&HFF,&H0,&H14,&H14,&H0,&H44,&H46,&H0,&H43,&HFF,&H0,&HFF,&H14,&H0,&H28,&HFE,&H0,&H44,&H2,&H0,&H44,&H43,&H0,&H44,&HFE,&H0,&HFD,&H3,&H0,&H28,&H12,&H0,&HFE,&HFF,&H0,&H3,&H14,&H0,&H44,&H46,&H0,&H43,&HFF,&H0,&HFD,&H14,&H0,&H14,&HFD,&H0,&H44,&H14,&H0,&H44,&HFE,&H0,&H43,&H3,&H0,&H44,&H12,&H0,&HFF,&H12,&H0,&H14,&H12,&H0,&H44,&H12,&H0,&H43,&H12,&H0,&HFF,&H11,&H0,&H28,&HFE,&H0,&H44,&H2,&H0,&H44,&HF,&H0,&H44,&HFE,&H0,&H0,&H3,&H0,&H0,&HFπDATA &H0,&H0,&HFF,&H0,&H0,&H28,&H0,&H0,&HFE,&H0,&H0,&H3,&H0,&H0,&H15,&H0,&H0,&H15,&H0,&H0,&H12,&H0,&H0,&HFE,&H0,&H0,&H2,&H0,&H0,&H11,&H0,&H0,&HFF,&H0,&H0,&H28,&H0,&H0,&H0,&H0,&H0,&H0,&H0,&H0,&H0,&H0,&H0,&H0,&H0,&H0,&H0,&H0,&H0,&H0,&H0,&H0,&H0,&H0,&H0,&H0,&H0,&H0,&H0,&H0,&H0,&H0,&H0,&H0,&H0,&H0,&H0,&H0,&H0,&H0,&H0,&H0,&H0,&H0,&H0,&H0,&H0,&H0,&H0,&H0,&H0,&H0,&H0,&H0,&H0,&H0ππInstrumentData:πDATA &H1,&H0,&HE4,&H9D,&H1,&H1F,&HE4,&H9DπDATA &H22,&H2,&H57,&H48,&H71,&H42,&HB3,&HBπDATA &HE1,&H2,&HC8,&HF9,&HF9,&HEC,&HF6,&H6CππREM $STATICπSUB CloseChannelsπFOR Channel% = &HB0 TO &HBFπ CALL WriteReg(Channel%, 0)πNEXTπEND SUBππSUB InitSongπRESTORE SongDataππFOR X% = 1 TO 790π  READ SongBuf(X%)πNEXTππRESTORE InstrumentDataππFOR X% = 1 TO 3π  ChannelStat(X%).Defined = 1π  ChannelStat(X%).SongPtr = 1ππ  READ CurrentIns.MMult, CurrentIns.MLevel, CurrentIns.MAttack, CurrentIns.MSustainπ  READ CurrentIns.CMult, CurrentIns.CLevel, CurrentIns.CAttack, CurrentIns.CSustainπ  π  Ficx% = X%π  SetIns X%π  X% = Ficx%ππNEXTππEND SUBππSUB InitStarsπFOR Fill% = 1 TO 100π Stars(Fill%).X = INT(RND * 320) + 1π Stars(Fill%).y = INT(RND * 200) + 1π Stars(Fill%).Speed = INT(RND * 5) + 1πNEXTππFOR X% = 1 TO 5π    OUT &H3C8, X%π    OUT &H3C9, X% * 12π    OUT &H3C9, X% * 12π    OUT &H3C9, X% * 12πNEXTπEND SUBππSUB MainππDOπ π  FOR X% = 1 TO 100π    PSET (Stars(X%).X, Stars(X%).y), 0π    Stars(X%).X = Stars(X%).X + Stars(X%).Speedπ      IF Stars(X%).X > 320 THENπ        Stars(X%).X = 0π        Stars(X%).y = INT(RND * 200) + 1π      END IFπ    PSET (Stars(X%).X, Stars(X%).y), Stars(X%).Speedπ  NEXTππ PlayMusicππLOOP UNTIL INKEY$ <> ""ππEND SUBππSUB PlayMusicππFOR Channel% = 1 TO MaxChannel%ππ  IF ChannelStat(Channel%).Defined = 0 THEN GOTO NoGotosPleaseππ  RChan% = Channel% - 1ππ  IF ChannelStat(Channel%).IsDone = 1 THENπ   ChannelStat(Channel%).PStat = TIMER + ChannelStat(Channel%).Speedπ   ChannelStat(Channel%).SongPtr = ChannelStat(Channel%).SongPtr + MaxChannel%π   ChannelStat(Channel%).IsDone = 0π   ChannelStat(Channel%).IsPlaying = 0π  END IFππ   IF ChannelStat(Channel%).IsPlaying = 0 AND SongBuf(ChannelStat(Channel%).SongPtr + Channel% - 1) <> 0 THENπ    ChannelStat(Channel%).PStat = TIMER + ChannelStat(Channel%).Speedπ     SELECT CASE SongBuf(ChannelStat(Channel%).SongPtr + RChan%)π       CASE 68π         WriteReg &HA0 + RChan%, &H81π         WriteReg &HB0 + RChan%, &H21 + 4 * ChannelStat(Channel%).Octaveπ       CASE 69π         WriteReg &HA0 + RChan%, &HB0π         WriteReg &HB0 + RChan%, &H21 + 4 * ChannelStat(Channel%).Octaveπ       CASE 70π         WriteReg &HA0 + RChan%, &HCAπ         WriteReg &HB0 + RChan%, &H21 + 4 * ChannelStat(Channel%).Octaveπ       CASE 71π         WriteReg &HA0 + RChan%, &H2π         WriteReg &HB0 + RChan%, &H22 + 4 * ChannelStat(Channel%).Octaveπ       CASE 65π         WriteReg &HA0 + RChan%, &H41π         WriteReg &HB0 + RChan%, &H22 + 4 * ChannelStat(Channel%).Octaveπ       CASE 66π         WriteReg &HA0 + RChan%, &H87π         WriteReg &HB0 + RChan%, &H22 + 4 * ChannelStat(Channel%).Octaveπ       CASE 67π         WriteReg &HA0 + RChan%, &HAEπ         WriteReg &HB0 + RChan%, &H22 + 4 * ChannelStat(Channel%).Octaveπ       CASE 17π         WriteReg &HA0 + RChan%, &H6Bπ         WriteReg &HB0 + RChan%, &H21 + 4 * ChannelStat(Channel%).Octaveπ       CASE 18π         WriteReg &HA0 + RChan%, &H98π         WriteReg &HB0 + RChan%, &H21 + 4 * ChannelStat(Channel%).Octaveπ       CASE 20π         WriteReg &HA0 + RChan%, &HE5π         WriteReg &HB0 + RChan%, &H21 + 4 * ChannelStat(Channel%).Octaveπ       CASE 21π         WriteReg &HA0 + RChan%, &H20π         WriteReg &HB0 + RChan%, &H22 + 4 * ChannelStat(Channel%).Octaveπ       CASE 15π         WriteReg &HA0 + RChan%, &H63π         WriteReg &HB0 + RChan%, &H22 + 4 * ChannelStat(Channel%).Octaveπ       π       CASE 255π         ChannelStat(Channel%).IsPlaying = 1π         ChannelStat(Channel%).PStat = TIMER + SongBuf(ChannelStat(Channel%).SongPtr + Channel% - 1 + MaxChannel%) / 100π         ChannelStat(Channel%).Flag = -1π       CASE 254π         ChannelStat(Channel%).Octave = SongBuf(ChannelStat(Channel%).SongPtr + Channel% - 1 + MaxChannel%)π         ChannelStat(Channel%).SongPtr = ChannelStat(Channel%).SongPtr + MaxChannel%π       CASE 253π         ChannelStat(Channel%).Speed = SongBuf(ChannelStat(Channel%).SongPtr + Channel% - 1 + MaxChannel%) / 100π         ChannelStat(Channel%).SongPtr = ChannelStat(Channel%).SongPtr + MaxChannel%π       CASE 252π         ChannelStat(Channel%).WaveForm = SongBuf(ChannelStat(Channel%).SongPtr + Channel% - 1 + MaxChannel%) - 300π         ChannelStat(Channel%).SongPtr = ChannelStat(Channel%).SongPtr + MaxChannel%π         IF RChan% > 2 THEN RRChan% = RChan% + 6 ELSE RRChan% = 0π         WriteReg &HE0 + RChan% + RRChan%, ChannelStat(Channel%).WaveFormπ       CASE 251π         ChannelStat(1).Flag2 = -1π          FOR MaxChan% = 1 TO MaxChannel%π           ChannelStat(MaxChan%).SongPtr = 1π           ChannelStat(MaxChan%).IsPlaying = 0π           ChannelStat(MaxChan%).IsDone = 0π          NEXTπ         CloseChannelsπ         EXIT SUBπ     END SELECTπ   END IFππ    IF ChannelStat(Channel%).IsPlaying = 1 THENπ     IF TIMER >= ChannelStat(Channel%).PStat THENπ      WriteReg &HB0 + RChan%, 0π      ChannelStat(Channel%).IsDone = 1π       IF ChannelStat(Channel%).Flag = -1 THENπ        ChannelStat(Channel%).SongPtr = ChannelStat(Channel%).SongPtr + MaxChannel%π        ChannelStat(Channel%).Flag = 0π       END IFπ     END IFπ    END IFπ  π   IF ChannelStat(Channel%).SongPtr > MaxChannel% + 1 THENπ     IF SongBuf(ChannelStat(Channel%).SongPtr + RChan%) <> 0 AND SongBuf(ChannelStat(Channel%).SongPtr - MaxChannel% + RChan%) < 250 THENπ       IF ChannelStat(Channel%).IsPlaying = 0 THEN ChannelStat(Channel%).IsPlaying = 1π     END IFπ   END IFππNoGotosPlease:πNEXT Channel%πππFOR Channel% = 1 TO MaxChannel%ππ IF ChannelStat(Channel%).IsPlaying = 0 THENπ  ChannelStat(Channel%).SongPtr = ChannelStat(Channel%).SongPtr + MaxChannel%π  IF ChannelStat(Channel%).SongPtr >= UBOUND(SongBuf) / MaxChannel% THENπ   ChannelStat(Channel%).SongPtr = 1π  END IFπ END IFπNEXT Channel%πππEND SUBππSUB SBInitπ   FOR z% = 1 TO &HF5π     WriteReg z%, 0π   NEXT z%πEND SUBππSUB SetIns (Channel%)πCarChan% = Channel% - 1πWriteReg &H20 + CarChan%, CurrentIns.CMultπWriteReg &H23 + CarChan%, CurrentIns.MMultπWriteReg &H40 + CarChan%, CurrentIns.CLevelπWriteReg &H43 + CarChan%, CurrentIns.MLevelπWriteReg &H60 + CarChan%, CurrentIns.CAttackπWriteReg &H63 + CarChan%, CurrentIns.MAttackπWriteReg &H80 + CarChan%, CurrentIns.CSustainπWriteReg &H83 + CarChan%, CurrentIns.MSustainπEND SUBππDEFINT A-ZπSUB WriteReg (Reg%, value%)πOUT BasePort% + 8, Reg%π FOR V% = 1 TO 6π  Buf% = INP(BasePort% + 8)π NEXTπOUT BasePort% + 9, value%π FOR V% = 1 TO 34π  Buf% = INP(BasePort% + 9)π NEXTπEND SUBππLAlvin Williams                 DIRECTORY LISTER               jw32@gnn.com                   10-17-96 (16:56)       QB, PDS                883  26361    DIRLIST.BAS DECLARE SUB Help ()π' DirLister.. (C) WASC. 1994.  See legal-release belowπ' internet: LATEAGAIN@DELPHI.COMππ' DirLister is a Subroutine to display and navigate through directories inπ' multiple columns and pages. I wrote it because i can't stand scrollingπ' pick lists and it's similar to a commercial product i use a lot.π'π' You may change the....π'  ..number of columns, number of rows , starting screen row andπ' starting screen column. See the line...π'***USER VARIABLES***π' ...in the ListDir sub.π'π' Since PDS's DIR$ function won't return a Directory (duh!)π' and QB dosn't have any DIR$ function, you willπ' have to load a library with the Interrupt call's.π' ie:π'          qb listdir / l c:\qb45\qb.qlbπ'     or   qbx listdir /l c:\bc7\libs\qbx.qlb    for PDS 7.1π' Since more people seem to have QB4.5 than PDS, i've re-coded this toπ' run as QB4.5 compatable.π'π'  PDS users need to swap the lines...π'           'Regs.ds = SSEG(spec$)   'PDS 7.1π'           Regs.ds = VARSEG(spec$)  'QB4.5π' ..in FUNCTION qbdir$()π' ..or not, depending on farstring usage.π'π' ...also the qbcurdir$() function can be removed and replacedπ' with the PDS func, CURDIR$.π'π' MONO and HERC users need to redo all the COLOR statements.π'π'  The source code to DirLister is made available to readers of theπ' All Basic Code Packets of ABC only.π' Any other distribution of the source code is prohibited.π' You may use/include/sell the compiled or 'Binary' version in anyway youπ'see fit.πππππDEFINT A-ZπDECLARE SUB DirLister (weAlreadyDidItYN%, thisfile%, mask$, dr$, tag%, dircnt%, numfiles%)πDECLARE SUB mainInput (prmpt$, cmdm2$, mode%, modet%)πDECLARE FUNCTION qbdir$ (mode%, spec$, a%)πDECLARE FUNCTION qbcurdir$ ()ππ'π'$DYNAMICπ'if using qbx.bi or qb.bi, you shouldn't need this...πTYPE RegTypeXπ ax AS INTEGERπ bx AS INTEGERπ cx AS INTEGERπ dx AS INTEGERπ bp AS INTEGERπ si AS INTEGERπ di AS INTEGERπ flags AS INTEGERπ ds AS INTEGERπ es AS INTEGERπEND TYPEπ' Data transfer Area, we need this and it has to be sharedπTYPE dta0π DTAmisc AS STRING * 21π Attr AS STRING * 1    ' this.....π Time AS INTEGERπ Date AS INTEGERπ Size AS LONGπ filename  AS STRING * 13  '..and this, are all we really needπEND TYPEπDECLARE SUB InterruptX (Intnum, InRegs AS RegTypeX, OutRegs AS RegTypeX)ππDIM SHARED regs AS RegTypeXπDIM SHARED buffer AS dta0ππDIM SHARED MaxDirEntry AS INTEGERππ'note: if you only want to return 1 file at a time, then thisπ' wouldn't need to be SHARED. You could REDIM it as necessary in theπ' listdir() sub and erase it as needed. Rework the parameters to listdir()π' so that it returns the file name.πDIM SHARED filename$(1024)  'dir and file namesπDIM SHARED fis%(1024)      'file-is%  root=1 dir=2 file=3 tagged file=6ππCALL Helpπmask$ = ""πorgdir$ = qbcurdir$ ' QB.45π'orgdir$ = CURDIR$   'PDS 7.1πCLSπDOπ  IF mask$ = "" THEN   ' if user reset mask$ we don't want to mess with itπ    mask$ = "*.*"π  END IFπ  CLSπ  CALL DirLister(weAlreadyDidItYN%, thisfile%, mask$, cd$, tag%, dircnt%, numfiles%)π  IF thisfile% = 0 THEN  'user pressed <Esc>, quit programπ    CLSπ    exitLOOPflag% = 1π  ELSEπ   'if the select file is a directory... change to itπ   IF fis%(thisfile%) = 2 OR fis%(thisfile%) = 1 THENπ    'strip arrow and space..2 charπ    IF fis%(thisfile%) = 2 THENπ      l% = LEN(filename$(thisfile%))π      IF LEN(cd$) = 3 THEN   'in root  'c:\'π    m$ = ""π      ELSE    'in a dir 'C:\THISDIR'  need a '\' on the endπ    m$ = "\"π      END IFπ    s$ = cd$ + m$ + RIGHT$(filename$(thisfile%), l% - 2)π    ELSEπ       s$ = ".."π    END IFπ    CHDIR s$π    weAlreadyDidItYN% = 0  'new dirπ    numfiles% = 0π    dircnt% = 0π   ELSEπ  π    PRINT "You selected: ";π   IF tag% = 0 THENπ    PRINT filename$(thisfile%)π   ELSEπ     PRINTπ     FOR i% = dircnt% TO numfiles%π      IF fis%(i%) = 6 THEN PRINT filename$(i%)π     NEXT i%π   END IFπ    PRINT "<Space bar> to see Directory again. "π    PRINT "<Esc> or <Q> to quit."π   π    mainInput "", k$, 1, mt%π    IF mt% = 27 THEN k$ = "Q"π    SELECT CASE k$π    'put any routines to process files hereπ    ' RUN, SHELL, ZIP, DELETE, etc.π    CASE "Q"   'Quitπ      exitLOOPflag% = 1π    END SELECTπ   END IFπ  END IFπLOOP UNTIL exitLOOPflag% = 1ππ'clean up and exitπIF Xhere% <> 1 THEN ' exit where we startedπ CHDIR orgdir$πEND IFπCLSπCLOSEπENDππREM $STATICπSUB DirLister (weAlreadyDidItYN%, thisfile%, mask$, dr$, tag%, dircnt%, numfiles%)π' DirLister.. (C) WASC. 1994.π' LATEAGAIN@DELPHI.COMππSTATIC filecnt%  '<--save this for next go aroundπDIM morep$(4)    '<--hold our Page Up , Page Down or both promptπ'set view window to 1-22..put commands and messages 23 to 25πtheBIGloopEXIT% = 0πDO  '<---------theBIGloopπVIEW PRINT 1 TO 24ππ    IF weAlreadyDidItYN% = 0 THEN   'if we havn't done this beforeπ      weAlreadyDidItYN% = 1     'well we're gonna do itπ      filecnt% = 0  ' zero this because it's staticπ      ' now load sub-dir'sπ         dr$ = qbcurdir$  ' QB.45π         'dr$ = CURDIR$   'PDS 7.1π         drive$ = LEFT$(dr$, 2)        'Get the current drive.π         null$ = qbdir$(0, "", 24)π         d$ = qbdir$(1, "*.*", 16)π        IF d$ <> "" THENπ           ef% = 0π           DOπ              GOSUB donameπ              d$ = qbdir$(2, "*.*", 16)π              IF d$ = "" THEN ef% = 1π            LOOP UNTIL ef% = 1π        END IFπ      'now sort dirsπ      filecnt% = dircnt%π      sortStart% = 1: sortend% = filecnt%π      GOSUB GSsortfname         'change to CALL QuickSort for speedπ      'z$ = DIR$(mask$)    'PDS 7.1π      z$ = qbdir$(1, mask$, 32)π      IF z$ <> "" THEN         ' if that worked try for moreπ        ef0% = 0: nomore% = 0ππ        DOπ         IF filecnt% >= 1024 THEN nomore% = 1     'too many filesπ         IF nomore% = 0 THEN                     'still going??π           filecnt% = filecnt% + 1π           fis%(filecnt%) = 3 'fileπ           filename$(filecnt%) = z$π           'z$ = DIR$  'PDS 7.1π           z$ = qbdir$(2, mask$, 32)π           IF z$ = "" THEN nomore% = 1    'last oneπ         ELSE                             'noπ           ef0% = 1                       ' set loop exitπ         END IFπ        LOOP UNTIL ef0% = 1ππ      ELSE    'no filesπ       IF filecnt% = 0 THEN 'no dirs either..must have problemsπ        LOCATE 1, 1π        PRINT "No files matching "; mask$; " where found."π        'wait for a keypressπ        mainInput "", k$, 1, mt%π        VIEW PRINT 1 TO 24π        EXIT SUBπ       END IFπ      END IFπ      'sort filesπ      sortStart% = dircnt% + 1: sortend% = filecnt%π      GOSUB GSsortfnameπ END IF  'end of wealreadygotitYN%ππ 'settings for pgdown page up status and display promptπ morep$(0) = "No more files. "π morep$(1) = "More Files.. Press <Page Down> to show. "π morep$(2) = "More Files.. Press <Page Up> to show. "π morep$(3) = "More Files.. Press <Page Up> or <Page Down> to show. "π l3$ = "Use <Space bar> to tag files. <F2> to change mask(*.*) <F1>=Help <Esc>=Quit "π l% = LEN(l3$): l3$ = l3$ + SPACE$(80 - l%)ππ'show files in dirπ 'filename$() is 12 char wideπ divider$ = " " + CHR$(179) + " "        ' do string work onceπ 'divider$ is 3 char wide..so.. fwidth% can't be less than 15.π '***USER VARIABLES***   change as neededπ fwidth% = 15         'make sure this fits num colsπ StartRow% = 3:π StartCol% = 2        'π numRowsIncol% = 20  '***set this anywhere from 2 to 24π             ' just make sure it fits the view print windowπ numcols% = 5         'cant be more than 5 or less than 1π '*****************ππ virtRow% = numRowsIncol% + (StartRow% - 1)π wedidcnt% = 0π hirow% = StartRow%: hicol% = StartCol% 'start out at first fileπ oldhirow% = hirow%: oldhicol% = hicol%π thisfile% = 1: oldthisfile% = 1        'set ptr to the first fileπ index% = 0                             'for multiple pages ie?:page 2 index=132π oldindex% = 0π wedidcnt% = 0π oldwedidcnt% = 0π numOnScreen% = numcols% * numRowsIncol%      'ie: 110= (22 rows *  5 col )π numFullpages% = filecnt% \ numOnScreen%   'use for <home> <end>π numextra% = filecnt% MOD numOnScreen%π dirpage% = 1π IF LEN(dr$) = 3 THEN  'faster than  mid$(π  k$ = ""π ELSEπ  k$ = "\"π END IFππ numf$ = STR$(filecnt% - dircnt%) + "-Files " + STR$(dircnt%) + "-Director"π IF dircnt% = 1 THENπ   numf$ = numf$ + "y"  'little grammer never hurtsπ ELSEπ  numf$ = numf$ + "ies"π END IFπ π l% = LEN(numf$)π IF l% <= 80 THEN     'make the line fit the screen nicelyπ   numf$ = numf$ + SPACE$(80 - l%)π ELSEπ   numf$ = RIGHT$(numf$, 80)π END IFππ title$ = "Dir: " + dr$ + k$ + mask$π l% = LEN(title$)π IF l% <= 80 THENπ   title$ = title$ + SPACE$(80 - l%)π ELSEπ   title$ = RIGHT$(title$, 80)π END IFππexitLOOP2flag% = 0πDOπ LOCATE StartRow% - 1, 1:π COLOR 0, 7π LOCATE StartRow% - 1, 1: PRINT numf$;π LOCATE StartRow% - 2, 1: PRINT title$;π 'LOCATE StartRow% + numRowsInCol%, 1: PRINT SPACE$(80);π COLOR 7, 0ππ pfLOOPexit% = 0π column% = StartCol%          'start here 1,(0)π rowcnt% = StartRow% - 1      ' we add 1 going in..set to (1 less) nowπ oldindex% = index%π oldthisfile% = thisfile%    ' if we are redrawing the page we need thisπ wedidcnt% = oldwedidcnt%   'save to come backππ DO   '════════  print filename LOOP   pfLOOPexit%π   wedidcnt% = wedidcnt% + 1π   rowcnt% = rowcnt% + 1          ' next rowπ   lastMaxRow% = rowcnt%          'save thisπ   maxcol% = column%              'save this for pgup, pgdownπ   ' the last column may not have maxrow% 'sπ   LOCATE rowcnt%, column%:π   IF fis%(wedidcnt%) = 6 THEN  'if file is tagged, then print boldπ     COLOR 15, 0π     PRINT filename$(wedidcnt%);π     COLOR 7, 0π   ELSEπ     PRINT filename$(wedidcnt%);  'else just printπ   END IFπ   LOCATE rowcnt%, column% + fwidth% - 2: PRINT divider$;π   IF wedidcnt% = filecnt% THEN                     'we do em all??π     pfLOOPexit% = 1π   ELSE                        'noπ    IF rowcnt% = (numRowsIncol% + StartRow% - 1) THEN  ' we fill up this col?π      column% = column% + fwidth%   ' move over 1 col (15 char)π      IF column% > (numcols% * fwidth%) THEN   'IF column% > 70 THEN we fill up screen  ?π    'yes , set up to do new screenπ    pfLOOPexit% = 1π      ELSE                   'no ..just move overπ    rowcnt% = StartRow% - 1π      END IFππ    END IFπ  END IFπ LOOP UNTIL pfLOOPexit% = 1    '════════print filname LOOP  pfLOOPexitπ'ππ 'figure out and  set more%, page up and page down flagsπ IF wedidcnt% < filecnt% THENπ   IF wedidcnt% > numOnScreen% THEN  'if wedicnt% >110 but < filecnt%π    'we are in the middleπ     more% = 3:   pgupok% = 1: pgdwnok% = 1   'next and previous pages existπ   ELSEπ     more% = 1: pgupok% = 0: pgdwnok% = 1    ' just next pages existπ   END IFπ ELSEπ   IF wedidcnt% > numOnScreen% THEN  'we are equal to file cnt,π   'but previous pages existπ     more% = 2: pgupok% = 1: pgdwnok% = 0  'so we show next pages exist but no previousπ   ELSE         ' no previouspage, no next page..soπ     more% = 0:  pgupok% = 0: pgdwnok% = 0    'no more filesπ   END IFπ END IFππ COLOR 0, 7π LOCATE StartRow% + numRowsIncol%, 1π k$ = " Use arrow keys to move. " + morep$(more%)π l% = LEN(k$): k$ = k$ + SPACE$(80 - l%)π PRINT k$;π LOCATE StartRow% + numRowsIncol% + 1, 1π PRINT l3$;π COLOR 7, 0ππ keyLOOPexit% = 0π DO  '════════KEY LOOPπ      'do this to keep from scrolling into a blank spotπ      ' in col one of the next pageπ     IF maxcol% = StartCol% THEN 'short 1 col page trap for right arrowπ    IF hirow% > lastMaxRow% THENπ      hirow% = lastMaxRow%: oldhirow% = hirow%π      'reclac thsifile%, save oldThisFile%π      GOSUB GScalcThisfileπ      oldthisfile% = thisfile%  'reset thisπ    END IFπ     END IFππ       ' print old- location in plain color ie: un-highlite itπ       LOCATE oldhirow%, oldhicol%:π    IF fis%(oldthisfile%) = 6 THEN 'its taggedπ      COLOR 15, 0π      PRINT filename$(oldthisfile%);π      COLOR 7, 0π    ELSE 'it aint taggedπ      PRINT filename$(oldthisfile%);π    END IFπ       ' high-lite current one in different colorπ       LOCATE hirow%, hicol%:π       IF fis%(thisfile%) = 6 THEN 'its taggedπ     COLOR 15, 4π       ELSE  'no tagπ     COLOR 0, 4π       END IFπ     PRINT filename$(thisfile%);π       COLOR 7, 0      'reset to old colorsππ       mainInput "", k$, 1, mt%          ' get one keypressπ       ' mt% contains the keycodeπ    IF k$ = CHR$(13) THEN mt% = 13π    oldhirow% = hirow%: oldhicol% = hicol%ππ    SELECT CASE mt%π    CASE 59 'F1=helpπ       CALL Helpπ       CLSπ         keyLOOPexit% = 1   'set for inner loop exit so we canπ         ' redraw the screenπ    CASE 83   'deleteπ     'confirm users choiceπ     'kill fileπ     'redo directoryπ    'CASE 1024  ' mouseMoveπ    'mouse routines deleted for space.π    'CASE 1025  'left mouse button clickπ    ' fake <Enter>π    CASE 72  'up  arrowπ        IF hirow% = StartRow% THEN  'if first..start at bottom of previous colπ         hirow% = virtRow%π         IF hicol% > StartRow% THEN    'move to prev column if not in firstπ           hicol% = hicol% - fwidth%π         ELSE                   ' move screen back if allowedπ          IF more% <> 0 AND more% <> 1 THENπ           GOSUB GSdopageupπ          ELSEπ           hirow% = StartRow% 'stay putπ          END IFπ         END IFπ        ELSEπ           hirow% = hirow% - 1  'otherwise..go up one rowπ        END IFπ    CASE 80   'downarrrow%  '80π        IF hirow% = virtRow% THEN  'if last, start at first row next columnπ          IF hicol% < (numcols% - 1) * fwidth% THEN    'if not last col go to nextπ         hirow% = StartRow%π         hicol% = hicol% + fwidth%  '15π          ELSE    'else last col move screen over if possibleπ        temp1% = hirow%  'save rowπ        GOSUB GSdopagedownπ        IF wewentdown% = 0 THEN 'no good, save spotπ          hirow% = temp1%: oldhirow% = temp1%π        END IFπ          END IFπ        ELSEπ           hirow% = hirow% + 1    'otherwise go down one colπ        END IFπ    CASE 75   'leftarrow%  '75     'π        IF hicol% > StartCol% THENπ          hicol% = hicol% - fwidth%    '15π        ELSE  'see if another screenπ         IF more% <> 1 THEN 'keep from moving if on first pageπ          'want to stay on same row for the new page..so...π          'save old row%..because GSdopageup sets it to 22π          temp1% = hirow%π          GOSUB GSdopageupπ          'get our row back if it changedπ        hirow% = temp1%: oldhirow% = temp1%π         END IFπ        END IFπ    CASE 77  'rightarrowπ        IF hicol% < (numcols% - 1) * fwidth% THENπ           hicol% = hicol% + fwidth%π        ELSE  'see if another screenπ        'save old row%..because GSdopageup sets it to 1π        temp1% = hirow%π        GOSUB GSdopagedownπ        'do this to keep from scrolling into a blank spotπ        ' in col one of the next pageπ          hirow% = temp1%: oldhirow% = temp1%π        END IFπ    CASE 81   'page downπ       'if at top of page, set to bottomπ       IF (hicol% <> maxcol% AND hirow% <> lastMaxRow%) OR (hicol% = maxcol% AND hirow% <> lastMaxRow%) THENπ         hicol% = maxcol%: hirow% = lastMaxRow%           ' |check for 1 col screenπ       ELSE  'set to next pageπ          GOSUB GSdopagedownπ       END IFπ    CASE 73    'page upπ       'if at bottom of page, set to top unless at top of page 1π       ' in which case we stay putπ       IF NOT (hirow% = StartRow% AND hicol% = StartCol%) OR (hirow% = StartRow% AND hicol% = StartCol% AND (more% = 1 OR more% = 0)) THEN   'don't askπ          hirow% = StartRow%: hicol% = StartCol%π       ELSE  'do a new pageπ        IF more% <> 1 THEN  'this is to keep hirow%=StartRow% ,hicol%=StartCol%π        ' if we are at the first pageπ          GOSUB GSdopageupπ        END IFπ       END IFπ    CASE 71  '<Home>π      ' just redraw the first page, set highliteπ      ' to the first file/directoryπ      CLS : keyLOOPexit% = 1   'set to redrawπ      hicol% = StartCol%: hirow% = StartRow%π      oldhicol% = hicol%: oldhirow% = hirow%π      index% = 0: oldwedidcnt% = 0π      thisfile% = 1: oldthisfile% = 1π    CASE 79 '<End>π         CLS : keyLOOPexit% = 1   'set to redrawπ         IF numFullpages% >= 1 AND numextra% <> 0 THENπ          ' cover's 1 page and half pageπ           index% = numFullpages% * numOnScreen%π         ELSEπ          IF numFullpages% <> 0 THENπ           index% = filecnt% - (numFullpages% * numOnScreen%)π          END IFπ         END IFπ           oldwedidcnt% = index%π         IF numFullpages% = 0 THENπ           temp2% = filecnt%π         ELSEπ           temp2% = numextra%π         END IFπ         thismanycol% = (temp2% \ numRowsIncol%)π         IF (temp2% MOD numRowsIncol%) > 0 THENπ        thismanycol% = thismanycol% + 1π         END IFπ         IF thismanycol% = 0 THENπ           hicol% = StartCol%π         ELSEπ           hicol% = ((thismanycol% * fwidth%) - fwidth%) + StartCol%π         END IFπ         hirow% = ((numextra% MOD numRowsIncol%) - 1) + StartRow%π         oldhirow% = hirow%: oldhicol% = hicol%π    CASE 27  '<Esc> exit and abort programπ        CLSπ        thisfile% = 0: tag% = 0          ' zero pointer to show no choiceπ         EXIT SUB   '<----EXIT POINTπ    CASE 13   '<Enter> 'when we exit, thisfile% is pointing to filename$(thisfile%)π        numfiles% = filecnt%π        CLS : keyLOOPexit% = 1: exitLOOP2flag% = 1π        theBIGloopEXIT% = 1π    CASE 60  '<F2>  change mask$π      'works better in a message box, but anyway...π      LOCATE 23, 1: PRINT SPACE$(27);   'clean off screen line for inputπ      LOCATE 23, 1: mainInput "Enter new mask ", mask$, 0, mt%π      IF mask$ = "" THEN mask$ = "*.*"π      CLS : keyLOOPexit% = 1: exitLOOP2flag% = 1π      weAlreadyDidItYN% = 0: filecnt% = 0: dircnt% = 0π    CASE 320   'space bar..tag a fileπ       'if fis%() is not a dir,π        IF fis%(thisfile%) = 3 THENπ          tag% = tag% + 1π          fis%(thisfile%) = 6π        ELSEπ          IF fis%(thisfile%) = 6 THENπ        tag% = tag% - 1π        fis%(thisfile%) = 3π          END IFπ        END IFπ    END SELECTπ    π    ' calculate new file pointerπ    GOSUB GScalcThisfileππ  LOOP UNTIL keyLOOPexit% = 1   '════════KEY LOOPππLOOP UNTIL exitLOOP2flag% = 1ππLOOP UNTIL theBIGloopEXIT% = 1ππ'clean upπVIEW PRINT 1 TO 24πEXIT SUBππππ'SUB routinesππGSdopagedown:π       wewentdown% = 0           'set to default ..noπ       IF pgdwnok% = 1 THEN      'if ok to go downπ         CLS :    wewentdown% = 1     'show we went downπ         oldwedidcnt% = wedidcnt%π         oldindex% = index%π         index% = wedidcnt%π         hirow% = StartRow%: hicol% = StartCol%  'start out at first file onπ                       ' screen  ie:LOCATE 1, 1π         oldhirow% = hirow%: oldhicol% = hicol%  'preset old Locationsπ         thisfile% = index% + 1:       ' set pointerπ         IF thisfile% > filecnt% THEN thisfile% = filecnt%π         oldthisfile% = thisfile%               'hilight the first fileπ         keyLOOPexit% = 1   'set for inner loop exit so we canπ         ' redraw the screenπ      END IFπRETURNπGSdopageup:π  wewentup% = 0    'set to defaultπ  IF pgupok% = 1 THENπ    wewentup% = 1   'show we went upπ    CLSπ    index% = index% - numOnScreen%     'bump the index backπ    oldindex% = oldindex% - numOnScreen%π    oldwedidcnt% = oldwedidcnt% - numOnScreen%π   'start out at last position on pageπ   'since we are going up, the last position has to be ...π    hirow% = virtRow%: hicol% = ((numcols% * fwidth%) - fwidth%) + StartCol%π    oldhirow% = hirow%: oldhicol% = hicol%π    thisfile% = index% + numOnScreen%   '110π    oldthisfile% = thisfile%      'point to the first fileπ    keyLOOPexit% = 1            'set for inner loop exitπ  END IFππRETURNπππGSsortfname:π' create a Quicksort SUB for speedπ' be sure and set STACK for enough roomπ' for recursive calls on 1024 filesπ' mean while.... plain old shell sortπ' courtesy of MicroSoft(C) examplesπ 'nothing new here...just make sure to sort fis%() along with filename$()πnoSwitch% = 0πOffset = (sortend% - sortStart%) \ 2πDO WHILE Offset > 0πLimit = sortend% - OffsetπDOπSwitch = noSwitch%πFOR temp1% = sortStart% TO LimitπIF filename$(temp1%) > filename$(temp1% + Offset) THENπSWAP filename$(temp1%), filename$(temp1% + Offset)πSWAP fis%(temp1%), fis%(temp1% + Offset)  'swap file isπSwitch = temp1%πEND IFπNEXT temp1%πLimit = Switch - OffsetπLOOP WHILE SwitchπOffset = Offset \ 2πLOOPππRETURNππGScalcThisfile:π ' save oldThisFile% toπ  oldthisfile% = thisfile%                 ' save old file pointerπ  thisfile% = index% + (((hicol% \ fwidth%) * 1) * numRowsIncol%) + (hirow% - (StartRow% - 1))π  'the above line is equal toπ  ' SELECT CASE hicol%π  ' CASE StartCol% 'column is 1π  '    thisfile% = index% + (0 * numRowsInCol%) + (hirow% - (StartRow% - 1))π  ' CASE fwidth% + startCol% 'column 2π  '    thisfile% = index% + (1 * numRowsInCol%) + (hirow% - (StartRow% - 1))           'x1=0 + hilited row + 22π  '....etcπ  ' if user tries to go to a blank area of the screenπ  ' just stay where we were .. see trap for short 1 col pageπ  IF thisfile% > filecnt% THENπ     thisfile% = oldthisfile%π     hirow% = oldhirow%: hicol% = oldhicol%π  END IFππRETURNππdoname:π   SELECT CASE d$π   CASE "."π      'do nothingπ   CASE ".."π      dircnt% = dircnt% + 1π      filename$(dircnt%) = CHR$(24) + " " + d$'up arrowπ      fis%(dircnt%) = 1   'rootπ   CASE ELSEπ     dircnt% = dircnt% + 1π     filename$(dircnt%) = CHR$(25) + " " + d$'downπ     fis%(dircnt%) = 2    'dirπ   END SELECTπRETURNππEND SUBππSUB Helpπ'πCLSπPRINT "**You can change this to use a window or something more upscale.**"πPRINT "**Just work it into your screen/window/setup**"πPRINT "Key usage...."πPRINT "<Enter> to change to directory or pick file."πPRINT "<F2> to change mask (*.*)"πPRINT "<Arrow Keys> to move from file to file or to next page."πPRINT "<Page Up> Go to top of current page or to previous page"πPRINT "<Page Down> Go to bottom of current page or to next page"πPRINT "<Home> Go to current root directory"πPRINT "<End> Go to last file on list"πPRINT "<Space Bar> Tags files in current directory"πPRINT "<Esc> Quit program"πPRINT "<F1> Help"πPRINTπmainInput "Press any key to continue...", k$, 1, mt%πππEND SUBππDEFSNG A-ZπSUB mainInput (prmpt$, cmdm2$, mode%, modet%)πmodet% = 0πSTATIC OOldrow%, Ooldcol%, cmdo$, otc%, obc%πππPRINT prmpt$;    'print promptπStartPos% = POS(0)πSTATIC cmdM$πSELECT CASE mode%πCASE 1                          'GET 1 CHARACTER AND RETURNπcmdM$ = "": inef% = 0πDOπ kk$ = INKEY$π l% = LEN(kk$)π IF l% > 0 THENπ  inef% = 1π  IF kk$ = CHR$(27) THENπ    modet% = 27π  ELSEπ     IF l% > 1 THENπ     c$ = RIGHT$(kk$, 1)π     IF c$ <> "" THENπ      scan% = ASC(c$)π      modet% = scan%ππ     END IFπ     END IFπ  END IFπ END IFπLOOP UNTIL inef% = 1πcmdm2$ = UCASE$(kk$)πIF cmdm2$ = CHR$(32) THEN modet% = 320πCASE ELSE   'input a UCASE$(string$) and exit when CR,Esc or a Func key is hitπ LOCATE , , 1π cmdM$ = "": inef% = 0π GOSUB keyloopπ PRINTπ cmdm2$ = UCASE$(cmdM$)π modet% = scan%πEND SELECTππEXIT SUBππkeyloop:πDOπ kk$ = INKEY$π l% = LEN(kk$)π IF l% > 0 THENπ  IF l% < 2 THENπ   a% = ASC(kk$)π   IF a% <> 13 THEN      'IF kk$ <> CHR$(13) THEN  <Enter>π     IF a% = 27 THEN     'IF kk$ = CHR$(27) THEN  <Esc>π       cmdm2$ = CHR$(27)π       modet% = 27π       EXIT SUB  '<---------exit pointπ     END IFπ     IF a% = 8 THEN       'IF kk$ = CHR$(8) THEN  'BACK SPACE KEYπ      l% = LEN(cmdM$)π      IF l% > 1 THEN 'no effectπ    cmdM$ = MID$(cmdM$, 1, l% - 1)π      ELSEπ    cmdM$ = ""π      END IFπ      Currow% = CSRLIN: CurCol% = POS(0)π      IF CurCol% > StartPos% THEN  'locate cursor, go back one, print a spaceπ       CurCol% = CurCol% - 1π       LOCATE Currow%, CurCol%π       PRINT " ";π       LOCATE Currow%, CurCol%π      END IFπ     ELSEπ      cmdM$ = cmdM$ + kk$π      PRINT kk$;π     END IFπ   ELSEπ     inef% = 1π     scan% = 13π   END IFπ  ELSE 'its control characters or function keyπ     c$ = RIGHT$(kk$, 1)π     IF c$ <> "" THENπ       scan% = ASC(c$)π       inef% = 1π     END IFπ   END IFπ  END IFπLOOP UNTIL inef% = 1πππRETURNπEND SUBππDEFINT A-ZπFUNCTION qbcurdir$π' DirLister.. (C) WASC. 1994.π' LATEAGAIN@DELPHI.COMπ  π   dbuffer$ = STRING$(65, CHR$(32))π   'see if drive is readyπ  π   'get current driveπ   regs.ax = &H1900π   CALL InterruptX(&H21, regs, regs)π   al% = regs.ax MOD 256π   c$ = CHR$(al% + 65) + ":\"    'A:=0 B:=1 C:=2 for prev INTπ   'get directoryπ   drive% = al% + 1              'A:=1 B:=2 C:=3 for this INTπ   regs.ax = &H4700π   regs.si = SADD(dbuffer$)π   regs.ds = VARSEG(dbuffer$)π   regs.dx = drive%π   CALL InterruptX(&H21, regs, regs)π   ecode% = regs.axπ  IF ecode% THENπ    zl% = INSTR(dbuffer$, CHR$(0))π    qbcurdir$ = c$ + LEFT$(dbuffer$, zl% - 1)π    dbuffer$ = ""π  ELSEπ    qbcurdir$ = ""π    dbuffer$ = ""π  END IFππ  πEND FUNCTIONππFUNCTION qbdir$ (mode%, spec$, a%)π ' a%=32 for files  16 for directoriesπ ' a%=24 for normal files and dirsπ STATIC attrib%π SELECT CASE mode%π CASE 0π    'call with a%=24 for normanl filesπ    'Set DTA Bufferπ    regs.ax = &H1A00π    regs.ds = VARSEG(buffer)π    regs.dx = VARPTR(buffer)π    CALL InterruptX(&H21, regs, regs)π    attrib = a%π CASE 1π       spec$ = spec$ + CHR$(0)π       regs.ax = &H4E00π       regs.cx = attrib%π       'Regs.ds = SSEG(spec$)   'PDS 7.1π       regs.ds = VARSEG(spec$)π       regs.dx = SADD(spec$)π       CALL InterruptX(&H21, regs, regs)π       ecode% = regs.axπ       IF ecode THENπ     qbdir$ = ""π       ELSEπ     IF ASC(buffer.Attr) = a% THENπ       zl% = INSTR(buffer.filename, CHR$(0))π       qbdir$ = LEFT$(buffer.filename, zl% - 1)π     ELSE   'found a match to spec$ but not to attributeπ       'and we need to return somethingπ       'recursive callπ       f$ = qbdir$(2, spec$, a%)π       qbdir$ = f$π     END IFπ       END IFπ       EXIT FUNCTIONπ CASE 2  'Find next file or dirπ     DOπ       regs.ax = &H4F00π       CALL InterruptX(&H21, regs, regs)π       ecode = regs.axπ       IF ecode THENπ     qbdir$ = ""π     EXIT FUNCTIONπ       ELSEπ    IF ASC(buffer.Attr) = a% THENπ      zl% = INSTR(buffer.filename, CHR$(0))π      qbdir$ = LEFT$(buffer.filename, zl% - 1)π      EXIT FUNCTIONπ    END IFπ       END IFπ     LOOPπ CASE 3  'Find next DIR onlyπ     DOπ       regs.ax = &H4F00π       CALL InterruptX(&H21, regs, regs)π       ecode = regs.axπ       IF ecode THENπ       qbdir$ = ""π       EXIT FUNCTIONπ       ELSEπ     IF ASC(buffer.Attr) = a% THENπ       zl% = INSTR(buffer.filename, CHR$(0))π       qbdir$ = LEFT$(buffer.filename, zl% - 1)π       EXIT FUNCTIONπ     END IFπ       END IFπ     LOOPπ END SELECTπEXIT FUNCTIONππππEND FUNCTIONπBen Kaashoek                   MISC. DETECTION ROUTINES       robertk@worldaccess.nl         10-28-96 (12:49)       QB, PDS                242  9576     DETECT.BAS  DEFINT A-Z                              'Use integers as default.ππREM $INCLUDE: 'qb.bi'                   'INTERRUPT include file in QB45π'REM $INCLUDE: 'qbx.bi'                  'INTERRUPT include file in QBX/PDSππ'The story:π' This little piece of code started out as a simple NDOS detection routine.π' Suddenly it became a "Why-Don't-I-Put-All-My-Detection-Routines-In-Here?"π' sort of program. Anyway. Hope you can use some of it.π' I will keep adding new detection routines to this file when I find others.π' So keep your eyes PEEKing:) for new detection stuff. There are loadsπ' more out there (and somewhere around here too).π' I tried to comment as much as possible. (Is there something like TOO muchπ' when you're commenting code?)π'π'                                                           BENπ'Resources:π' - Ralph Brown's Interrupt List. I think V43 (Get your hands on it)π'   A newer version will probably be released into the public domain.π' - Microsoft Windows V3.11 helpfile (Honest, it actually containedπ'   something usefull. ;-) ).π' - NDOS helpfile.ππDECLARE SUB NDOSVersion (majVer%, minVer%)         'Works OK.πDECLARE SUB SMARTDRVInfo (Hits&, misses&, dirty&, majVer%, minVer%, HitRate%, oops%)πDECLARE SUB SMARTDRVSize (full%, current%, BytesPerElement!, windows%)ππDECLARE FUNCTION DetectANSI% ()πDECLARE FUNCTION DetectDOSKEY% ()πDECLARE FUNCTION DetectKSTACK% ()                  'Untested.πDECLARE FUNCTION DetectNDOS% ()                    'It detects my NDOS V7.0πDECLARE FUNCTION DetectNGUIDES% ()                 'Works OK.πDECLARE FUNCTION DetectNovellIPX% ()               'Untested.πDECLARE FUNCTION DetectSMARTDRV% ()                'Works OK.πDECLARE FUNCTION DetectXMS% ()                     'Works OK.πDECLARE FUNCTION PutKeysInKSTACK% (Keys$)          'Untested.ππDIM SHARED Inreg AS RegType, Outreg AS RegTypeπDIM SHARED InRegX AS RegTypeX, OutRegX AS RegTypeXππ'-------------------------- Begin demonstration ----------------------------ππCONST False = 0: True = NOT False       'Boolean constants.ππSCREEN 12: CLS : COLOR 7                'Test is independent of screenmode!πIF DetectNGUIDES THENπ PRINT "Norton Guide is resident in memory"πELSEπ PRINT "Norton Guide is not resident in memory"πEND IFππIF DetectNDOS THENπ NDOSVersion Maj%, Min%π PRINT "NDOS V"; LTRIM$(STR$(Maj%)); "."; LTRIM$(STR$(Min%)); " detected"πELSEπ PRINT "NDOS not detected"πEND IFππIF DetectNovellIPX THENπ PRINT "Novell Netware IPX driver detected"πELSEπ PRINT "Novell Netware IPX driver not detected"πEND IFππIF DetectDOSKEY THENπ PRINT "DOSKEY detected"πELSEπ PRINT "DOSKEY not detected"πEND IFππIF DetectXMS THENπ PRINT "V2.0+ XMS driver detected"πELSEπ PRINT "V2.0+ XMS driver not detected"πEND IFππIF DetectKSTACK THENπ PRINT "KSTACK.COM detected"πELSEπ PRINT "KSTACK.COM not detected"πEND IFππIF DetectANSI THENπ PRINT "ANSI.SYS detected"πELSEπ PRINT "ANSI.SYS not detected"πEND IFππIF DetectSMARTDRV THENπ SMARTDRVInfo Hits&, misses&, dirty&, majVer%, minVer%, HitRate%, oops%π PRINT "SMARTDRV V"; LTRIM$(STR$(majVer)); "."; LTRIM$(STR$(minVer)); " detected"π PRINT USING " ├─ Cache hits   : #####"; Hits&π PRINT USING " ├─ Cache misses : #####"; misses&π PRINT USING " ├─ Dirty caches : #####"; dirty&π PRINT USING " ├─ Cache hitrate: ###%"; HitRate%ππ 'Notice how the hitrate only changes after disk activity.π 'Why?, that's because the drive has become a SMART drive :-).π 'Theoretically it should not exceed 100% (if it does you have aπ 'really smart one).ππ SMARTDRVSize full%, current%, BytesPerElement!, windows%π DosSize& = current% * BytesPerElement!π WinSize& = windows% * BytesPerElement!π TotalSize& = full% * BytesPerElement!π PRINT " └─ Cache sizes (bytes)"π PRINT USING "     ├─ DOS     = ########"; DosSize&π PRINT USING "     ├─ Windows = ########"; WinSize&π       PRINT "     │          ----------- +"π PRINT USING "     └─ Total   = ########"; TotalSize&πELSEπ PRINT "SMARTDRV not detected"πEND IFπPRINT ""πCOLOR 15πPRINT "Hope you can use this. Happy keyboard crunching !"ππDO: LOOP UNTIL INKEY$ <> ""             'Wait until a key is pressed.πCOLOR 7                                 'Restore default MS-DOS colour.πSCREEN 0                                'Restore screen (else Win95 crashes HARD)πEND                                     'Terminate program.ππ'---------------------------- End demonstration ----------------------------ππFUNCTION DetectANSIπInreg.AX = &H1A00                       'Function 1Ah, Subfunction 0hπCALL INTERRUPT(&H2F, Inreg, Outreg)     'Call DOS (Int 2Fh)πDetectANSI = 0                          'Assume it's not thereπIF Outreg.AX \ 256 = &HFF THEN DetectANSI = -1πEND FUNCTIONππFUNCTION DetectDOSKEY%πInreg.AX = &H4800                       'Function 48h, Subfunction 0hπCALL INTERRUPT(&H2F, Inreg, Outreg)     'Call DOS (Int 2Fh)πDetectDOSKEY% = 0                       'Assume it's not thereπIF Outreg.AX MOD 256 <> 0 THEN DetectDOSKEY% = -1πEND FUNCTIONππFUNCTION DetectKSTACKπInreg.AX = &HE44F                   'Function E4h, Subfunction 4FhπInreg.BX = 0πCALL INTERRUPT(&H2F, Inreg, Outreg) 'Call DOS (Int 2Fh)πDetectKSTACK = 0                    'Assume it's not there.πIF Outreg.AX = &H44EE THEN DetectKSTACK = -1πEND FUNCTIONππFUNCTION DetectNDOS%πInreg.AX = &HE44D                   'Function E4h, Subfunction 4DhπCALL INTERRUPT(&H2F, Inreg, Outreg) 'Call DOS (Int 2Fh)πDetectNDOS = 0                      'Assume it's not there.πIF Outreg.AX = &H44EE THEN DetectNDOS = -1πEND FUNCTIONππFUNCTION DetectNGUIDES%πInreg.AX = &HF398                       'Function F3h, Subfunction 98hπCALL INTERRUPT(&H16, Inreg, Outreg)     'Call DOS (Int 16h)πDetectNGUIDES% = 0                      'Assume it's not there.πIF Outreg.AX = &H6A73 THEN DetectNGUIDES% = -1πEND FUNCTIONππFUNCTION DetectNovellIPX%π'I haven't tested this routine because I don't have a network. Maybe in a fewπ'year's I can continue programming even when nature calls :-)πInreg.AX = &H7A00                       'Function 7Ah, Subfunction 0hπCALL INTERRUPT(&H2F, Inreg, Outreg)     'Call DOS (Int 2Fh)πIF Outreg.AX MOD 256 = 0 THEN DetectNovellIPX% = 0πIF Outreg.AX MOD 256 = &HFF THEN DetectNovellIPX% = -1πEND FUNCTIONππFUNCTION DetectSMARTDRV%πInreg.AX = &H4A10                    'function 4Ah, Subfunction 10hπInreg.BX = 0                         'Sorry, lost the info on this !πInreg.CX = &HEBAB                    'Sorry, lost the info on this !πCALL INTERRUPT(&H2F, Inreg, Outreg)  'Call DOS (Int 2fh)πDetectSMARTDRV = 0                   'Assume it's not there.πIF Outreg.AX = &HBABE THEN DetectSMARTDRV = -1πEND FUNCTIONππFUNCTION DetectXMS%πInreg.AX = &H4300                       'Function 43h, Subfunction 0hπCALL INTERRUPT(&H2F, Inreg, Outreg)     'Call DOS (int 2Fh)πDetectXMS% = 0                          'Assume it's not there.πIF Outreg.AX MOD 256 = &H80 THEN DetectXMS% = -1πEND FUNCTIONππSUB NDOSVersion (majVer%, minVer%)πInreg.AX = &HE44D                       'Function E4h, Subfunction 4DhπCALL INTERRUPT(&H2F, Inreg, Outreg)     'Call DOS (Int 2Fh)πmajVer% = minVer% = 0                   'Return zeroes if NDOS not loaded.πIF Outreg.AX = &H44EE THEN              'Modify version if it's there.π majVer% = Outreg.BX MOD 256            'Major version in register BLπ minVer% = Outreg.BX \ 256              'Minor version in register BHπEND IFπEND SUBππFUNCTION PutKeysInKSTACK% (Keys$)π'If it doesn't work you may have to uncomment the line marked with "<---"π'and change the parameter of the VARSEG/SADD instruction.π'Many DOS functions require a Zero terminated string (ASCIIZ for short).ππ'KeysZ$ = Keys$ + CHR$(0)              '<--- Uncomment this oneπInRegX.AX = &HE44F                     'Function E4h, Sub-function 4FhπInRegX.BX = 1πInRegX.CX = LEN(Keys$)                 'Number of keystrokes being passed.πInRegX.DS = VARSEG(Keys$)              'Segment of the keystroke string.πInRegX.DX = SADD(Keys$)                'Address of the keystroke string.πCALL INTERRUPTX(&H2F, InRegX, OutRegX) '| Int 2FhπEND FUNCTIONππSUB SMARTDRVInfo (Hits&, misses&, dirty&, majVer%, minVer%, HitRate%, oops%)πSTATIC PrevHits&, PrevTotal&         'Keep data of previous call.πInreg.AX = &H4A10                    'function 4Ah, subfunction 10hπInreg.BX = 0πInreg.CX = &HEBABπCALL INTERRUPT(&H2F, Inreg, Outreg)  'Call DOS (int 2fh)πIF Outreg.AX = &HBABE THENπ Hits& = Outreg.DX * &H100 + Outreg.BXπ misses& = Outreg.DI * &H100 + Outreg.SIπ dirty& = CLNG(Outreg.CX)π majVer% = VAL(HEX$(Outreg.BP)) \ 100π minVer% = VAL(HEX$(Outreg.BP)) - majVer * 100π oops% = 0πELSEπ oops% = -1π EXIT SUBπEND IFππ'Calculate the hitrate with the formula as found in Microsoft Windows help.π'Hit_rate = 100 * (CurrentHits - PreviousHits) / (CurrentTotal - PreviousTotal)πCurrTotal& = Hits& + misses& + dirty&πHitRate% = 100 * (Hits& - PrevHits&) / (CurrTotal& - PrevTotal&)πEND SUBππSUB SMARTDRVSize (full%, current%, BytesPerElement!, windows%)πInreg.AX = &H4A10                     'function 4Ah, subfunction 10hπInreg.BX = &H4πCALL INTERRUPT(&H2F, Inreg, Outreg)   'Call DOS (Int 2Fh)πfull% = Outreg.AX                     'Size in elements of full sized cacheπcurrent% = Outreg.BX                  'Current size in elementsπBytesPerElement! = Outreg.CX          'Size of one element in bytesπwindows% = Outreg.DX                  'Number of elements under windowsπEND SUBπDouglas H. Lusher              VGA 640X480 PANNING            comp.lang.basic.misc           10-04-96 (09:52)       QB, QBasic, PDS        252  8318     VGAPAN.BAS  ' Greetings, fellow BASIC programmers.π' I just finished working out how to do pixel-by-pixel scrollingπ' on a VGA card and I thought that this might interest some ofπ' you, so here's a quick demo. What this code does is this: itπ' creates a virtual screen much larger than the usual SCREEN 12π' 640x480, then prints graphics to this larger virtual screen.π' When you press a key, the graphics stop being printed and youπ' can use the arrow keys to pan around and observe differentπ' parts of the virtual screen.ππ' When the VGA card sets up a screen mode, the Offset Registerπ' &H3D5, index &H13 contains the amount of display memory to beπ' used per horizontal scan line. The virtual screen is made widerπ' than the ordinary screen by increasing this value. The Startπ' Address High and Start Address Low registers, &H3D5 index &HCπ' & &HD contain the MSB and LSB respectively of the address inπ' video memory where the displayed screen begins. Increasing orπ' decreasing this value by 1 pans the screen left or right byπ' 8 pixels. Changing this value by the amount of memory per scanπ' line pans the screen up or down. Notice that horizontal panningπ' by this method alone moves the screen 8 pixels at a time. Toπ' pan horizontally a pixel at a time involves the Horizontalπ' PEL Panning register &H3C0 index &H13. Rotating the values ofπ' this register from 0 through 7 pans the screen pixel-column π' by pixel-column. Note that this register must only be changedπ' during a vertical retrace and that an INP(&H3DA) command mustπ' preceed a change to this register. Also, bit 5 must always beπ' set.ππ' It is worth noting also that the normal BASIC graphics commandsπ' will not work on the larger virtual screen, so I have providedπ' my own code to create the graphics in this demo. While the codeπ' for these graphics commands is good, it is just BASIC and is π' not necessarily optimised, so I realized that it is slow. Thatπ' particular aspect is not the focus of this demo.ππ DECLARE SUB QPrint (X%, Y%, Text$, Culler%)π DECLARE SUB DrawCircle (X%, Y%, Radius%, Culler%)π DECLARE SUB PutPixel (X%, Y%, Culler%)π DECLARE SUB DrawLine (X1%, Y1%, X2%, Y2%, Culler%)π DEFINT A-Zπ REDIM BitMask%(0 TO 7)π Mask% = 128π FOR Bit% = 0 TO 7π   BitMask%(Bit%) = Mask%: Mask% = Mask% \ 2π NEXTππ RANDOMIZE TIMERπ SCREEN 12: ScrnWid% = 640: ScrnHgt% = 480ππ 'the width of the virtual screen in pixels:π VScrnWid% = 832π 'In SCREEN 12, the following must be true:π '  VScrnWid% must be equal to or greater than 640π '  VScrnWid% must be less than or equal to 1088π '  VScrnWid% must be evenly divisible by 16π HPanLimit% = VScrnWid% - ScrnWid%π BytesPerLine% = VScrnWid% \ 8ππ 'the height of the virtual screen in pixels:π VScrnHgt% = 624π 'In SCREEN 12, the following must be true:π '  VScrnHgt% must be equal to or greater than 480π '  VScrnHgt% must be less than or equal to 819π '  The product of VScrnHgt% multiplied by VScrnWid% must be lessπ '      than or equal to 524288π VPanLimit% = VScrnHgt% - ScrnHgt%ππ 'create the virtual screen:π OUT &H3D4, &H13: OUT &H3D5, VScrnWid% \ 16ππ 'put up some graphicsπ MinX% = 0: MaxX% = VScrnWid% - 1π MinY% = 0: MaxY% = VScrnHgt% - 1π CALL DrawLine(MinX%, MinY%, MaxX%, MinY%, 1)π CALL DrawLine(MaxX%, MinY%, MaxX%, MaxY%, 2)π CALL DrawLine(MaxX%, MaxY%, MinX%, MaxY%, 3)π CALL DrawLine(MinX%, MaxY%, MinX%, MinY%, 4)ππ RR% = VScrnHgt%: IF VScrnWid% < VScrnHgt% THEN RR% = VScrnWid%π DO UNTIL LEN(INKEY$)π   X1% = INT(RND * VScrnWid%)π   Y1% = INT(RND * VScrnHgt%)π   X2% = INT(RND * VScrnWid%)π   Y2% = INT(RND * VScrnHgt%)π   C% = INT(RND * 14) + 1π   CALL DrawLine(X1%, Y1%, X2%, Y2%, C%)π   R% = INT(RND * (RR% \ 4))π   X1% = INT(RND * (VScrnWid% - R% * 2)) + R%π   Y1% = INT(RND * (VScrnHgt% - R% * 2)) + R%π   C% = INT(RND * 14) + 1π   CALL DrawCircle(X1%, Y1%, R%, C%)π LOOPπ CALL QPrint(8, 8, "Upper Left", 15)π CALL QPrint(VScrnWid% - 96, 8, "Upper Right", 15)π CALL QPrint(8, VScrnHgt% - 16, "Lower Left", 15)π CALL QPrint(VScrnWid% - 96, VScrnHgt% - 16, "Lower Right", 15)ππ 'allow the user to pan around the virtual screenπ X% = 0: Y% = 0π DOπ  DO WHILE LEN(INKEY$): LOOPπ  DO: KP$ = INKEY$: LOOP UNTIL LEN(KP$)π  KP% = ASC(KP$): IF KP% = 0 THEN KP% = -ASC(MID$(KP$, 2))π  SELECT CASE KP%π    CASE 27π      EXIT DOπ    CASE 52, -75  'Four, LArrowπ      IF X% > 0 THENπ        X% = X% - 1π        DO: LOOP WHILE (INP(&H3DA) AND 8) = 0π        OUT &H3C0, &H33: OUT &H3C0, X% MOD 8π      ELSEπ        BEEPπ      END IFπ    CASE 54, -77   'Six, RArrowπ      IF X% < HPanLimit% THENπ        X% = X% + 1π        DO: LOOP WHILE (INP(&H3DA) AND 8) = 0π        OUT &H3C0, &H33: OUT &H3C0, X% MOD 8π      ELSEπ        BEEPπ      END IFπ    CASE 56, -72  'Eight, UpArrowπ      IF Y% > 0 THENπ        Y% = Y% - 1π      ELSEπ        BEEPπ      END IFπ    CASE 50, -80  'Two, DnArrowπ      IF Y% < VPanLimit% THENπ        Y% = Y% + 1π      ELSEπ        BEEPπ      END IFπ  END SELECTπ  Ptr% = (Y% * BytesPerLine%) + (X% \ 8)π  OUT &H3D4, &HD: OUT &H3D5, Ptr% MOD 256π  OUT &H3D4, &HC: OUT &H3D5, Ptr% \ 256π LOOPπ SCREEN 0: WIDTH 80π ENDππ SUB DrawCircle (X%, Y%, Radius%, Culler%)π 'a routine to draw circles using only integers and integer mathπ 'an implementation of Bresenham's algorithmπ 'by Douglas H. Lusher, 05-09-1996π A% = 0π B% = Radius%π D% = (1 - Radius%) * 2π XX1% = X%: YY1% = Y% + B%π XX2% = X%: YY2% = Y% - B%π XY1% = X% + B%: YX1% = Y%π XY2% = X% - B%: YX2% = Y%π DO WHILE B% >= A%π   CALL PutPixel(XX1%, YY1%, Culler%)π   CALL PutPixel(XX1%, YY2%, Culler%)π   CALL PutPixel(XX2%, YY1%, Culler%)π   CALL PutPixel(XX2%, YY2%, Culler%)π   CALL PutPixel(XY1%, YX1%, Culler%)π   CALL PutPixel(XY1%, YX2%, Culler%)π   CALL PutPixel(XY2%, YX1%, Culler%)π   CALL PutPixel(XY2%, YX2%, Culler%)π   IF D% + B% > 0 THENπ     B% = B% - 1π     D% = D% - (B% * 2) + 1π     YY1% = YY1% - 1: YY2% = YY2% + 1π     XY1% = XY1% - 1: XY2% = XY2% + 1π   END IFπ   IF A% > D% THENπ     A% = A% + 1π     D% = D% + (A% * 2) + 1π     XX1% = XX1% + 1: XX2% = XX2% - 1π     YX1% = YX1% + 1: YX2% = YX2% - 1π   END IFπ LOOPπ END SUBπ π SUB DrawLine (X1%, Y1%, X2%, Y2%, Culler%)π 'a routine to draw lines using only integers and integer mathπ 'an implementation of Bresenham's algorithmπ 'by Douglas H. Lusher, 05-08-1996π A% = X2% - X1%π B% = Y2% - Y1%π DX2% = 1: DY2% = 1π IF A% < 0 THEN A% = -A%: DX2% = -1π IF B% < 0 THEN B% = -B%: DY2% = -1π DX1% = DX2%: DY1% = 0π IF A% < B% THEN SWAP A%, B%: DX1% = 0: DY1% = DY2%π I1% = B% * 2π D% = I1% - A%π I2% = D% - A%π X% = X1%: Y% = Y1%π FOR I% = 0 TO A%π  CALL PutPixel(X%, Y%, Culler%)π  IF D% < 0 THENπ    X% = X% + DX1%π    Y% = Y% + DY1%π    D% = D% + I1%π  ELSEπ    X% = X% + DX2%π    Y% = Y% + DY2%π    D% = D% + I2%π  END IFπ NEXTπ END SUBππ SUB PutPixel (X%, Y%, Culler%)π SHARED BitMask%(), BytesPerLine%π DEF SEG = &HA000π Offset& = (CLNG(Y%) * BytesPerLine%) + (X% \ 8)π OUT &H3CE, 5: OUT &H3CF, 2π OUT &H3CE, 8: OUT &H3CF, BitMask%(X% AND 7)π Byte% = PEEK(Offset&): POKE Offset&, Culler%π END SUBππ SUB QPrint (X%, Y%, Text$, Culler%)π 'this routine uses the VGA hardware to print textπ '  in 16 color graphics modesπ 'by Douglas H. Lusher, 06-08-1996π SHARED BytesPerLine%ππ ' 8 x 8 char box, CGAπ CharSegment% = &HFFA6: CharOffset% = &HE: CharHgt% = 8ππ ' 8 x 16 char box, VGAπ 'DIM Regs AS RegTypeXπ 'Regs.AX = &H1130π 'Regs.BX = &H600π 'CALL InterruptX(&H10, Regs, Regs)π 'CharSegment% = Regs.ES: CharOffset% = Regs.BP: CharHgt% = 16ππ REDIM BitPattern%(1 TO CharHgt%)π Temp& = (CLNG(Y%) * BytesPerLine%) + (X% \ 8)π VideoSegment% = &HA000 + (Temp& \ 16)π VideoOffset% = (Temp& MOD 16) - 1π OUT &H3CE, 5: OUT &H3CF, 2: OUT &H3CE, 8π FOR Char% = 1 TO LEN(Text$)π   Ptr% = CharHgt% * ASC(MID$(Text$, Char%, 1)) + CharOffset% - 1π   DEF SEG = CharSegment%π   FOR Ln% = 1 TO CharHgt%π     BitPattern%(Ln%) = PEEK(Ptr% + Ln%)π   NEXTπ   VideoPtr% = VideoOffset% + Char%π   DEF SEG = VideoSegment%π   FOR Ln% = 1 TO CharHgt%π     OUT &H3CF, BitPattern%(Ln%)π     Byte% = PEEK(VideoPtr%): POKE VideoPtr%, Culler%π     VideoPtr% = VideoPtr% + BytesPerLine%π   NEXTπ NEXTπ END SUBπTika Carr                      GUI LIBRARY V1.23 W/DOCS       itaiya@juno.com                10-25-96 (14:07)       QB, PDS                380  11252    GUI123.BAS  ===================== GUI Interface Programmer's Library v 1.23 DocsπGUI Interface Programmer's Library v. 1.23 for QuickBasic 4.5 8/9/96πCopyright 1996 by Tika CarrππThese routines use the QB.QLB library.  I put everything you need into oneπfile, which is also a demo of some of the things that the GUI routines can do.ππCALL Mouse(x) x = 0 Initialize Mouse, 1 Show Mouse, 2 Hide Mouse,π3 Get mouse informationππYou MUST CALL Mouse(0) to start the mouse. Then CALL Mouse(1) to showπthe mouse. mx, my is the mouse coordinates and mb is the mouse button,πif you use CALL Mouse(3). These are global variables defined in GUI.BI.ππCALL gprint ("Text", x, y, color)ππThis routine lets you print text on screen according to pixel location. Putπthe Text in quotes. X and Y are Pixel locations, not LOCATE locations, so youπcan go x up to 640 and Y up to 480. color is from 0 to 15 (standard VGAπcolors). See GUI.BI for more info on Palettes and Colors.ππButtons, Pop Up Menus, Frames, Check Boxes, Radio Buttons:ππCALL drwbtn (style, color, frame offset, frame color, x1, y1, x2, y2)π               |      |         |             |        |           |π               --------         ---------------        -------------π                Inside             Outside             Coordinatesπ            of button/frame        of frameππ3-D Push Buttons:ππStyle 1 and Style 2 are for making those push buttons like "OK" orπ"Escape", etc. Style 1 is a pushed in button, and Style 2 is a normalπbutton.ππCALL drwbtn(1, 3, 0, 0, 3, 3, 55, 18)   'Button is pushed (selected).πCALL drwbtn(2, 3, 0, 0, 75, 3, 121, 18) 'Button is not pushed.ππNote that the frame offset and color values are not used for push buttons.ππFramed Pop-Ups:ππThere are four styles of framed popup type windows that give a 3-Dπlook:ππCALL drwbtn(3, 6, 10, 5, 3, 25, 103, 125)   'Frame Style 3 (On/Off)πCALL drwbtn(4, 3, 10, 2, 110, 25, 210, 125) 'Frame Style 4 (Off/On)πCALL drwbtn(5, 8, 10, 7, 220, 25, 320, 125) 'Frame Style 5 (On/On)πCALL drwbtn(6, 11, 10, 10, 340, 25, 440, 125)'Frame Style 6 (Off/Off)ππStyle 3: Inlaid frame with embossed interior.πStyle 4: Embossed frame with inlaid interior.πStyle 5: Inlaid frame and interior.πStyle 6: Embossed frame and interior.ππNote that we used an offset of 10 in the above 4 examples. This givesπus a nice frame boarder. You can set this at any size in pixels thatπyou wish. The color value after style is the color of the interior andπthe color value after frame offset is the color of the surroundingπframe. The other values are the upper left and lower right corners ofπthe entire pop up.ππCheck Boxes:ππStyles 7 and 8 create check boxes:ππCALL drwbtn(7, 4, 0, 0, 3, 135, 18, 150)     'Plain Check BoxπCALL drwbtn(8, 4, 0, 0, 23, 135, 38, 150)    'Plain Check Box CheckedππNote again that the frame values are not used.ππRadio Buttons:ππRadio buttons use the values a bit differently from the others. They are:ππdrwbtn(style, color, radius, center mark color, x, y, nul, nul)ππStyles 9 and 10 provide you with the standard circular radio buttons:ππCALL drwbtn(9, 9, 8, 0, 50, 143, 0, 0)     'Radio ButtonπCALL drwbtn(10, 9, 8, 15, 70, 143, 0, 0)   'Radio Button OnππThe center mark color is the color of the dot that goes in the centerπof a selected radio button. Only the x and y coordinates are needed,πand the other x and y parameters are 0 (not used).ππPopup Input Box:ππ(New for Version 1.23)ππPopInp(Prompt$, T2Len, x1, y1, CurClr)ππPrompt$ is what you'd like to ask the user. T2Len is the maximumπamount of characters you will allow in the input field. x1 and y1 are theπupper left corner coordinates. CurClr is the color of the cursor.ππExample:ππCALL PopInp("Do You Really Want To Quit?", 1, 160, 120, 3)ππI think I'll stop here with the GUI project, due to the fact I just don't haveπtime to develop it much further. Of course, anyone is invited to add to it.πHopefully this was a start.  This code is usable by anyone who wishes, as longπas they give credit to the proper people in their program code and in theπon-screen of the finished product (ie. in an "About" menu).  The code in thisπlibrary is not for commercial use.ππTika Carr 1:2613/601ππCREDITS: All routines written by Tika Carr, except the GPrint routine,πwhich was written by Douglas Lusher.πππ================= GUI Interface Programmer's Library v. 1.23 Source Codeπ'GUI123.BAS 8/9/96π'GUI Interface Programmer's Library v. 1.23π'for QuickBasic 4.5π'Copyright 1996 by Tika Carrππ'Contact:π'Tika Carr 1:2613/601π'kari@rochgte.fidonet.orgππDECLARE SUB clrscrn (clr%)πDECLARE SUB drwbtn (ds%, dc%, dfs%, dfc%, dx1%, dy1%, dx2%, dy2%)πDECLARE SUB gprint (z$, x%, y%, c%)πDECLARE SUB Mouse (a%)πDECLARE SUB PopInp (Prompt$, T2Len%, x1%, y1%, CurClr%)ππ'$INCLUDE: 'qb.bi'ππCOMMON SHARED mb%, mi%, mt%, mx%, my%        'mouse variablesπCOMMON SHARED black%, white%                 'used for paletteπCOMMON SHARED T2$                            'PopInp resultsπDIM SHARED Inregs AS RegType, Outregs AS RegType        'InterruptπDIM SHARED Regs AS RegTypeX                             'InterruptXππSCREEN 12: CLS      '640 x 480 16 color VGA 80 x 30 textππ'** PALETTE ASSIGNMENT **ππ' Color 0 and Color 15 are system colors (black and white) and shouldπ' not be changed as they are used for buttons and such.ππblack% = 0: white% = 15ππDEFINT A-ZππWIDTH 80, 60ππ'Clear the screen to color #3 (Cyan)πCALL clrscrn(3)ππ'Change white to be 7, causing the boarder highlight to be greyπ'instead of white. Change the menu bar to be white, then draw menuπ'bar, and change white back to color #14 (white)ππwhite = 7πCALL drwbtn(2, 15, 0, 0, 0, 0, 639, 20)πwhite = 15ππ'The "Exit" box in the upper left.πCALL drwbtn(2, 7, 0, 0, 2, 2, 18, 18)πCALL gprint("X", 6, 4, 0)ππ'The "Help" box in the upper right.πCALL drwbtn(2, 7, 0, 0, 619, 2, 637, 18)πCALL gprint("?", 624, 4, 0)ππ'Menu OptionsπCALL gprint("File", 55, 3, 0)πCALL gprint("Edit", 107, 3, 0)ππ' A boxed frame text boxπCALL drwbtn(4, 9, 10, 1, 10, 30, 629, 459)ππ' Some text in the boxπa$(1) = "Here is an example of some things you can do in the GUI interface."πa$(2) = "I want to thank Douglas H. Lusher for his help in writing the gprint"πa$(3) = "routine. He developed a faster way to print text on the screen. This"πa$(4) = "routine does what the PRINT statement can't: Prints text virtually"πa$(5) = "anywhere on the screen, and transparently over the graphics."ππy = 34πFOR g = 1 TO 5π    y = y + g + 16π    CALL gprint(a$(g), 32, y, 14)πNEXT gππStart:π'Loop to trap mouse eventsπCALL Mouse(0)       'initialize mouseπCALL Mouse(1)       'show mouseπWHILE mb = 0        'trap eventsπ    CALL Mouse(3)π    LOCATE 60, 1π    PRINT mx, my, mb;πWENDππ'The "Exit" box in the upper left clicked on.πIF mx > 2 AND my > 3 AND mx < 18 AND my < 18 THENπ    CALL Mouse(2)   'hide mouseπ    CALL drwbtn(1, 7, 0, 0, 2, 2, 18, 18)π    CALL gprint("X", 6, 4, 0)π    FOR delay = 1 TO 30000: NEXTπ    CALL drwbtn(2, 7, 0, 0, 2, 2, 18, 18)π    CALL gprint("X", 6, 4, 0)π    CALL PopInp("Do You Really Want To Quit?", 1, 160, 120, 3)π    IF LCASE$(T2$) = "n" THEN RUN ELSE ENDπEND IFππGOTO StartππSUB clrscrn (clr%)πLINE (0, 0)-(639, 479), clr%, BFπEND SUBππSUB drwbtn (ds, dc, dfs, dfc, dx1, dy1, dx2, dy2)πIF ds >= 3 AND ds <= 6 THEN c = dfc ELSE c = dcπSELECT CASE dsπ    CASE 1: GOSUB dOnπ    CASE 2: GOSUB dOffπ    CASE 3: GOSUB dOn: GOSUB Inside: GOSUB dOffπ    CASE 4: GOSUB dOff: GOSUB Inside: GOSUB dOnπ    CASE 5: GOSUB dOn: GOSUB Inside: GOSUB dOnπ    CASE 6: GOSUB dOff: GOSUB Inside: GOSUB dOffπ    CASE 7: GOSUB Dsquπ    CASE 8: π        GOSUB Dsquπ        LINE (dx1, dy1)-(dx2, dy2), black%π        LINE (dx1, dy2)-(dx2, dy1), black%π    CASE 9: GOSUB Dcirπ    CASE 10:π        GOSUB Dcirπ        CIRCLE (dx1, dy1), (15 - dfs) \ 2, dfcπ        PAINT (dx1, dy1), dfc, dfcπEND SELECTππGOTO DdoneππDsqu:π    LINE (dx1, dy1)-(dx2, dy2), black%, Bπ    PAINT (dx2 - 4, dy2 - 4), c, black%πRETURNππDBold:π    GOSUB Dsquπ    LINE (dx1 + 1, dy1 + 1)-(dx2 - 1, dy2 - 1), black%, BπRETURNππdOn:π    GOSUB DBoldπ    LINE (dx1 + 1, dy2 - 1)-(dx2 - 1, dy2 - 1), white%π    LINE -(dx2 - 1, dy1 + 1), white%πRETURNππdOff:π    GOSUB DBoldπ    LINE (dx1 + 1, dy2 - 1)-(dx1 + 1, dy1 + 1), white%π    LINE -(dx2 - 1, dy1 + 1), white%πRETURNππDcir:π    CIRCLE (dx1, dy1), dfs, black%π    PAINT (dx1, dy1), dc, black%πRETURNππInside:π    dx1 = dx1 + dfs: dy1 = dy1 + dfsπ    dx2 = dx2 - dfs: dy2 = dy2 - dfsπ    c = dcπRETURNππDdone:πdx1 = dx1 - dfs: dy1 = dy1 - dfsπdx2 = dx2 + dfs: dy2 = dy2 + dfsππEND SUBππSUB gprint (z$, x%, y%, c%)πRegs.ax = &H1130πRegs.bx = &H600πCALL INTERRUPTX(&H10, Regs, Regs)πCharSegment% = Regs.es: CharOffset% = Regs.bpπCharWid% = 8: CharHgt% = 16ππDEF SEG = CharSegment%πXX% = xπFOR Char% = 1 TO LEN(z$)π   Ptr% = CharHgt% * ASC(MID$(z$, Char%, 1)) + CharOffset%π   FOR Ln% = 0 TO CharHgt% - 1π     BitPattern& = PEEK(Ptr% + Ln%) * 256&π     LineFormat% = (BitPattern& - 32768) XOR -32768π     LINE (XX%, y + Ln%)-STEP(CharWid% - 1, 0), c, , LineFormat%π   NEXTπ   XX% = XX% + CharWid%πNEXTπDEF SEGπEND SUBππSUB Mouse (a%)πInregs.ax = a%πCALL INTERRUPT(&H33, Inregs, Outregs)πmb = Outregs.bx     'button 0 = off 1 = left 2 = rightπmx = Outregs.cx     'x coordinateπmy = Outregs.dx     'y coordinateπmi = Outregs.ax     'init (dummer variable)ππEND SUBππDEFSNG A-ZπSUB PopInp (Prompt$, T2Len%, x1%, y1%, CurClr%)ππIF LEN(Prompt$) > T2Len% THEN PBoxLen = LEN(Prompt$) ELSE PBoxLen = T2Len%πx2% = x1% + (PBoxLen + 2) * 8: y2% = y1% + 64: nx = x1%: ny = y1%ππCALL Mouse(2)πBitsPerPixel = 1: planes = 4        'Screen Mode 12πAry% = 4 + INT(((x2% - x1% + 1) * (BitsPerPixel) + 7) / 8) * planes * ((y2% - y1%) + 1)ππDIM VScreen(1 TO Ary%)πGET (x1%, y1%)-(x2%, y2%), VScreenππCALL drwbtn(2, 7, 0, 0, x1%, y1%, x2%, y2%)πx1% = x1% + 8πCALL gprint(Prompt$, x1%, y1% + 8, 0)ππInloop:πy1% = y1% + 32π'Input FieldπCALL gprint(">", x1%, y1%, 0)πCALL gprint(STRING$(T2Len%, 219), x1% + 8, y1%, 15)ππ'** Turn on and show cursorπx1% = x1% + 8πcursor$ = CHR$(219)πCALL gprint(cursor$, x1%, y1%, 4)ππ'** Get Input and move cursorππT2$ = ""π1 T1$ = INKEY$: IF T1$ = "" THEN 1 'wait for keypressπst = ASC(T1$)ππ'Backspace and eraseππIF st = 8 THENπ        'checks to make sure its in fieldπ        x1% = x1% - 8: IF x1% < nx + 16 THEN x1% = nx + 16: GOTO 1π        CALL gprint(cursor$, x1% + 8, y1%, 15)π        CALL gprint(RIGHT$(T2$, 1), x1%, y1%, 0)π        CALL gprint(cursor$, x1%, y1%, 4)π        'subtracts deleted character from stringπ        IF LEN(T2$) >= 1 THEN T2$ = LEFT$(T2$, LEN(T2$) - 1)π        GOTO 1πEND IFππIF T1$ = CHR$(13) THEN GOTO 2  'End of input when ENTER is pressed.ππIF st < 32 OR st > 127 THEN BEEP: GOTO 1  'check for illegal characterππ'Character ok, add to string, move cursorππT2$ = T2$ + T1$πCALL gprint(cursor$, x1%, y1%, 15)πCALL gprint(T1$, x1%, y1%, 0)πx1% = x1% + 8π'checks to make sure its in fieldπIF x1% > (nx + T2Len% * 8 + 8) THEN BEEP: GOTO 1πCALL gprint(cursor$, x1%, y1%, 4)ππ'Get more inputπGOTO 1ππ2 'Erase menu, restore what was underneathπPUT (nx, ny), VScreen, PSETπERASE VScreenπCALL Mouse(1)ππEND SUBπKurt Kuzba                     SUBROUTINE & FUNCTION USAGE    FidoNet QUIK_BAS Echo          10-06-96 (22:08)       QB, QBasic, PDS        92   4523     SUBTUTOR.BAS'>   What is the difference between SUBs and FUNCTIONS?π'>.........π'_|_|_|   SUBTUTOR.BASπ'_|_|_|   A short tutorial on SUB and FUNCTION usage.π'_|_|_|   No warrantee or guarantee is given or implied.π'_|_|_|   Released   PUBLIC DOMAIN   by Kurt Kuzba.  (10/6/96)πCOLOR 15, 1: CLSπPRINT " This is a short tutorial on use of SUB and FUNCTION in QBasic"πPRINT " and Quick Basic. It explores some of the relationships of"πPRINT " variables between modules. By studying the code and following"πPRINT " with the text, one may grasp module concepts."πPRINT " Variables in a SUB or FUNCTION, unless declared as STATIC,"πPRINT " are AUTOMATIC variables. BASIC initializes them every time"πPRINT " the module containing them is called. They may have the same"πPRINT " name as variables in other modules without confusion."πPRINT " SHARED and PASSED variables will be examined. Ready?"πDO: LOOP WHILE INKEY$ = "": CLSπPRINT " We will begin with the SUB. Variables may be passed by SEG or"πPRINT " or by VAL. Variables enclosed in parentheses are passed by VALue."πPRINT " FUNCTION variables must be enclosed in a group parentheses, and"πPRINT " we may also use VAL parentheses. First, we will pass by VALue."πPRINT : MyStr$ = "This won't be changed.": MySub (MyStr$)πPRINT " MyStr$ = "; MyStr$: PRINTπPRINT " As you can see, MyStr$ is unchanged"πDO: LOOP WHILE INKEY$ = "": CLSπPRINT " Now we will pass by SEGment.": PRINTπMyStr$ = "This will be changed."πMySub MyStr$: PRINT " MyStr$ = "; MyStr$: PRINTπPRINT " Since the ADDRESS of MyStr$ was passed, the SUB was"πPRINT " able to change the contents of the variable."πDO: LOOP WHILE INKEY$ = "": CLSπPRINT " Now we will use a FUNCTION and pass by VALue.": PRINTπMyStr$ = "This won't be changed.": FuncStr$ = MyFunc((MyStr$)):πPRINT " MyFunc$ = "; FuncStr$: PRINT " MyStr$ = "; MyStr$: PRINTπPRINT " As a result, MyStr$ is unchanged, and a new string is created."πDO: LOOP WHILE INKEY$ = "": CLSπPRINT " Now we will pass MyStr$ by SEGment.": PRINTπMyStr$ = "This will be changed.": FuncStr$ = MyFunc(MyStr$):πPRINT " MyFunc$ = "; FuncStr$: PRINT " MyStr$ = "; MyStr$: PRINTπPRINT " We still got the new string, but now MyStr$ has changed!"πDO: LOOP WHILE INKEY$ = "": CLSπPRINT " Unlike subroutines using GOSUB, variables found in the"πPRINT " MAIN module are unknown in the SUB or FUNCTION routines."πPRINT " This is known as the SCOPE of a variable. In order for a"πPRINT " variable to be VISIBLE to a SUB or FUNCTION, it must be"πPRINT " declared as being SHARED, or be passed as an argument."πDO: LOOP WHILE INKEY$ = "": PRINTπMyStr$ = "This is MyStr$.": MyShare: PRINT " MyStr$ = "; MyStr$: PRINTπPRINT " This way, variables are available to your SUB or FUNCTION."πDO: LOOP WHILE INKEY$ = "": CLSπPRINT " In addition, we may declare variables SHARED in the main"πPRINT " module by use of the DIM statement.": PRINTπDIM OurStr AS STRING * 32: OurStr = "This is a shared string."πMySub OurStr: PRINT " OurStr = "; OurStr: PRINTπPRINT " So here we see that this string is shared in the SUB."πDO: LOOP WHILE INKEY$ = "": PRINTπPRINT " If we were to pass a fixed length string as an argument,"πPRINT " then the contents of the string would be passed and not the"πPRINT " string itself, although, if that string were passed by SEGment,"πPRINT " then whatever changes were made to the passed string would be"πPRINT " stored in the fixed string when we exit the SUB or FUNCTION."πDIM FixedStr AS STRING * 10: FixedStr = "A string"πPRINT " FixedStr = "; FixedStr: Fixed FixedStrπPRINT " FixedStr = "; FixedStr: PRINTπPRINT " The SUB string is a temporary dynamic string created by the SUB"πPRINT " and truncated to fit into the fixed length string."πDO: LOOP WHILE INKEY$ = "": PRINTπPRINT " I hope this answers most of your questions concerning"πPRINT " the use of SUBs and FUNCTIONs in QBasic and Quick Basic."πDO: LOOP WHILE INKEY$ = "": COLOR 2, 0: CLSπ'_|_|_|   end   SUBTUTOR.BASππSUB Fixed (p$)π   PRINT " (passed string)p$ = "; p$π   p$ = "This string is way too big for FixedStr."π   PRINT " (passed string)p$ = "; p$πEND SUBππFUNCTION MyFunc$ (p$)π   PRINT " (passed variable)p$ = "; p$: p$ = "changed"π   MyFunc$ = "This is an entirely new string!"πEND FUNCTIONππSUB MyShareπ   SHARED MyStr$: PRINT " SHARED variable MyStr$ = "; MyStr$π   MyStr$ = "This variable, being SHARED, may be changed."πEND SUBππSUB MySub (p$)π   PRINT " (passed variable)p$ = "; p$: p$ = "changed"πEND SUBππAndrew L. Ayers                GET/PUT INFO. FOR VGA MODE 13H andrewa@indirect.com           09-09-96 (00:00)       Text                   342  15018    GETPUT13.TXT-----------------------------------------------------------------------------π        Mode 13 VGA (320x200x256) GET/PUT Information and Techniquesππ                  By Andrew L. Ayers - September 9th, 1996ππ-----------------------------------------------------------------------------ππThe following is what I have found out through trial and error (as well asπa bit of logical guesswork). While I have found it to work on every machineπI have tried it with, do not assume it is so for your machine. Instead, pro-πceed with caution. While none of this should cause major problems (ie. I doπnot believe it will trash your machine or anything), a wrong step could causeπyour machine to lock up, forcing you to reboot. Anyway, this is intended forπinformational purposes only. I cannot be held responsible for the use/abuseπof the information contained herein, nor can I be held responsible for anyπdamage done to the person or the machine on which the examples contained inπthis document are run upon. Just the standard disclaimer to CMA!ππIf you find this information useful, and choose to include the techniques inπyour own code, please be kind and mention my name. You don't have to do thisπ(hell, if I mentioned everyone's name I have learned from, that list would beπa mile long!), but it would be nice.ππI wish to thank Jason Grooms - for guiding my first steps into the wonderfulπworld of assembler (back then, 6809), and to Brent Dill, for showing me howπto do strange and crazy stuff with GET/PUT, and a host of other tips. Brent,πif your read this, contact me. I'm on the 'Net. I know you are worth yourπsalt to find me. L8r!ππ=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=ππCalculating the buffer size for GET/PUT in mode 13:ππ1. Take the width of the area you are getting (in pixels) and multiply itπ   by the height (in lines). This will give you the total number of bytesπ   in the area for the buffer.ππ2. Find the total number of WORDs to use by dividing the number of bytes byπ   two. We need the total number of WORDs because the smallest variable typeπ   we can use is an integer, which is WORD size (2 bytes).ππ3. We now have the amount of space needed to store the area we want to GET.π   But BASIC needs a couple of more pieces of information in order for GETπ   and PUT to operate correctly. These two pieces of information are theπ   width and the height of the image! It needs these two items in order forπ   the PUT routine to know when to stop drawing. So, the width and theπ   height of the image area must be stored with the image data itself. Theseπ   two values are placed into their own WORDs at the start of the buffer. Weπ   must add on two WORDs to accomodate this.ππ4. We now have the total number of WORDs needed to DIMension an integer arrayπ   to hold our image data. Because the base of the array starts at zero, weπ   will subtract one from our total number of WORDs to DIMension our array:ππ    DIM buffer%(# of WORDs)ππ5. Our buffer data layout looks like so:ππ    WORD    DESCRIPTIONπ    ----    --------------------------------------------------π       0    Width, contained in the high byte of the WORD.π        This value is in bits (!), and so must be dividedπ        by 8 to find out the number of pixels (bytes).π       1    Height, contained in the high byte of the WORD.π        Value in number of lines.π       2    Start of data...π       .π       .π       .π      XX    End of data...ππExample:ππ1. We have a 16x16 sprite. So we need 256 bytes in order to hold an area thisπ   big.ππ2. We need the number of WORDs, so we divide by 2, giving us 128 WORDs.ππ3. We add two words to accomodate the width and height values needed by PUT,π   giving us a total of 130 WORDs.ππ4. We subtract 1, and dimension our array:ππ    DIM buffer%(129)ππ5. Our buffer data layout looks like so:ππ    WORD    DESCRIPTIONπ    ----    --------------------------------------------------π       0    Width, contained in the high byte of the WORD.π        This value is in bits (!), and so must be dividedπ        by 8 to find out the number of pixels (bytes).π       1    Height, contained in the high byte of the WORD.π        Value in number of lines.π       2    Start of data...π       .π       .π       .π     129    End of data...ππ=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=ππMultiple Image Buffers for GET/PUT:ππWhat was shown above was an example for a simple buffer to hold a singleπimage to be used in GET/PUT. Using the above simple example, we would just do theπfollowingππ        GET(0,0)-(15,15),buffer%π        PUT(100,100),buffer%,PSETππin order to GET/PUT a single simple image. But what if we needed 30 spritesπ(say for a game)? We could do thisππ        DIM buffer1%(129), buffer2%(129),...,buffer30%(129)ππthen use GET/PUT to move everything around, but this is wasteful, and notπvery easy to work with. What if we wanted animation? What then?ππFortunately, there is an easy way out, using what is called offsetting. Weπhave a buffer of a set size we are GETing and PUTing with. What isn't beingπshown is what is called the offset. An offset is a number added to a fixedπvalue to obtain a new start value. When we dimension an array, the start ofπthat array is obtained and kept by BASIC (we can use VARSEG and VARPTR toπfind it if we wanted to). If we say DIM a%(20), then say a%(2)=15, we haveπused an offset of 2 from the start of the array and placed 15 at that pos-πition in memory. A similar thing is done by GET/PUT. Note the following:ππ        DIM buffer%(129)π        GET(0,0)-(15,15),buffer%ππis the same as:ππ        DIM buffer%(129)π        GET(0,0)-(15,15),buffer%(0)ππWe just didn't use the offset of zero in the first example! What would happenπif we did the following?:ππ        DIM buffer%(129)π        GET(0,0)-(15,15),buffer%(10)ππWe would get an error. This is because we need 130 WORDs of space for theπarea we are trying to GET, and we only have a total of 130 WORDs to playπwith. By trying to put an offset of 10 into the mix, we overrun the end ofπthe array by 10 WORDs! The following would work:ππ        DIM buffer%(139)π        GET(0,0)-(15,15),buffer%(10)ππNow WORD number 10 would hold our width and WORD number 11 our height, andπ12 through 139 would hold our data. We could then PUT(100,100),buffer%(10),PSETπand everything would work fine. Now what would happen if we PUT(100,100),πbuffer%(0),PSET? We would either get an error or garbage, because PUT wouldn'tπhave the correct width and height info in the first two WORDs! So, we needπto keep track of the size so we know what offsets we can use when GETing andπPUTing our images.ππOur example is a 16x16 sprite. We would like to have 30 of these for ourπultra cool game we are writing. We need 130 WORDs for each of these spritesπ(2 for width/height, 128 for data), and we want 30 sprites, so we need aπbuffer that is 3900 WORDs long (130 WORDs x 30 sprites). We know that everyπ130 WORDs is a new sprite, so that will be our offset. If we set our offsetπto 0, then we are on the first sprite, 130 is the second, 260 is the third,πand so on. The following shows how:ππ        DIM sprite%(3899)π        spritenum%=2π        GET(0,0)-(15,15),sprite%(spritenum%*130)π        spritenum%=5π        PUT(100,100),sprite%(spritenum%*130),PSETππBefore you can put a sprite, you obviously need to GET it, so that PUT hasπthe width/height info to work with. So lines 4 and 5 wouldn't work in ourπexample unless we changed line 2 to "spritenum%=5".ππWe now have an easy way to GET/PUT a whole mess of sprites on the screenπusing a single buffer that is easily accessible. We could do simple animationπwith this system. Say our first five sprites were already in the buffer andπthey were an animation of some type. To flip through them, we would do theπfollowing:ππ        FOR spritenum%=0 TO 4π          PUT(100,100),sprite%(spritenum%*130),PSETπ        NEXT spritenum%ππIt is that easy.ππOur buffer layout now looks like this, for those interested:ππ    WORD    DESCRIPTIONπ    ----    --------------------------------------------------π       0    Width, contained in the high byte of the WORD.π        This value is in bits (!), and so must be dividedπ        by 8 to find out the number of pixels (bytes).π       1    Height, contained in the high byte of the WORD.π        Value in number of lines.π       2    Start of sprite0 data...π       .π       .π       .π     129    End of sprite0 data...ππ     130    Width, contained in the high byte of the WORD.π        This value is in bits (!), and so must be dividedπ        by 8 to find out the number of pixels (bytes).π     131    Height, contained in the high byte of the WORD.π        Value in number of lines.π     132    Start of sprite1 data...π       .π       .π       .π     259    End of sprite1 data...ππ     260    Width, contained in the high byte of the WORD.π        This value is in bits (!), and so must be dividedπ        by 8 to find out the number of pixels (bytes).π     261    Height, contained in the high byte of the WORD.π        Value in number of lines.π     262    Start of sprite2 data...π       .π       .π       .π     389    End of sprite2 data...ππAnd so on...ππThe only other thing you need to keep in mind is buffer size versus spriteπsize. As noted before, a 16x16 sprite needs 130 WORDs in order to store itπcompletely in an array. When you have multiple sprites in an array, thereπis a limit to the size of your array you can have. This limit is 64K - 65536πbytes, or 32768 WORDs. To find out how many sprites you can store in a singleπarray, divide 32768 by the number of WORDs required for each sprite. Drop anyπvalues after the decimal (that is, take the integer, drop the remainder), andπthis is the maximum number of sprites you can store. For our example of aπ16x16 sprite (130 WORDs), this works out to be 252 sprites. Take that numberπand multiple by the number of WORDs per sprite, subtracting 1, to use forπDIMensioning the array: DIM buffer%(32759).ππThe following table breaks down common sprite sizes and array dimensions:ππ    Sprite Size  Number  Array Size (in WORDs)π    -----------  ------  ---------------------------------π       8 x 8       963   34 for sprite, 32741 for arrayπ      16 x 16      252   130 for sprite, 32759 for arrayπ      32 x 32       63   514 for sprite, 32381 for arrayπ      64 x 64       15   2050 for sprite, 30749 for arrayππIf you need more sprites, you can split them over two arrays. Animation andπsuch becomes more difficult to handle, but it can be done. ππAlso remember, the larger the sprite, the more data the computer has to shoveπaround. Stay away from the 64 x 64 sprites, except for maybe big bosses orπsuch. These things are memory HOGS. The only other limit to be aware of isπQBASIC's 160K limit on program AND code size. One buffer of sprites (252πsprites) will eat almost 64K, leaving you with less than 100K to put theπrest of your code in! QuickBASIC and PowerBASIC users shouldn't have anyπproblem though. Some of these problems may be overcome by using EMS routinesπto shove the sprite data into extended memory, though.ππ=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=ππGETing and PUTing without The BOX:ππIf you have ever used GET and PUT, you know that when you PUT, a "box" isπleft around your image obliterating anything under and around your sprite.πThis looks very ugly and unprofessional in a game. The following shows theπbest way to get rid of this problem, using a method called sprite masking.ππ1. First, for each and every sprite you create, create a "mask" for it. Thisπ   mask is the same size and shape as the original sprite, only it consistsπ   of only two colors, 0 and 255 (or &H0 and &HFF for you hex folks). Colorπ   all visible portions of the sprite (those portions you want to obscureπ   the background) with color 0. Color all invisible portions of the spriteπ   (those protions you want the background to show through) with color 255.π   Remember, you need one mask for each sprite, and this will knock yourπ   sprite count down by half, so keep it in mind when designing your game.ππ2. To display your sprite, simply PUT the mask image down using the AND op-π   erator, then place the sprite image down using the OR operator. The ANDπ   and OR operators are called bitwise boolean operators, and have theπ   following truth tables:ππ            AND            ORπ    -------------------    -------------------π    IN1    IN2    OUT    IN1    IN2    OUTπ    -------------------    -------------------π    0    0    0    0    0    0π    1    0    0    1    0    1π    0    1    0    0    1    1π    1    1    1    1    1    1ππ   These tables basically mean the following. If you take two bits and ANDπ   or OR them together, the result equals a 1 or a 0 depending on the inputsπ   and the relationship between them in the truth tables for the operator inπ   question. If you understand this - read on. If you understand this andπ   are 10 - 14 years old, you don't need college (just kidding ;).ππ   Now, for what we are doing, we have a background of different byte valuesπ   (which consist of a series of bits). Our mask only has two values in it,π   the byte 0 (00000000 in binary) and the byte 255 (11111111 in binary).π   Let me show you how the magic works:ππ   A.    Our Background Image    AND    Mask    =    Resultππ    11110110              11111111        11110110π    11110110              11000011        11000010π    11110110              11000011        11000010π    11110110              11000011        11000010π    11110110              11111111        11110110ππ  B.    Our Result           OR      Sprite    =    Resultππ    11110110              00000000        11110110π    11000010              00111100        11222210π    11000010              00111100        11222210π    11000010              00111100        11222210π    11110110              00000000        11110110ππ  If you notice, I have used 2s in place of 1s on the final result to showπ  the example better. Those 2s should really be 1s, so don't let that throwπ  you. Suffice to say, if you look carefully, we have placed our 8 x 5π  sprite on the background, without the border showing.ππ=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=ππGETing and PUTing without The BOX, method 2:ππThe next best way to GET and PUT without the box showing, is to simply notπdraw those pixels in the first place. The only way to do that (short of mod-πifying BASIC itself) is to write your own PUT routine, to skip over any pixelπof a defined color (0 in our case). This would have two advantages: Numberπone, your sprite could be drawn faster because you only set the pixels youπneed, and number two, you wouldn't double your buffer requirements for πsprites because you would only need the sprites, and could eliminate theπmasks! All sounds good until you try to write the thing in BASIC...it isπhorribly slow (ok, on a fast system, it runs at an acceptable pace). The onlyπway to get around this is to code it in a lower level language (or at leastπone that can compile down to a faster version). I have done this, and youπcan find the results of my labor in the ABC Packets. It is called the Blast!πlibrary. It allows you to do the above, and much more. Check it out!ππMike Kristopert                VIDEO POKER                    /SiliconValley/Park/6165/      07-25-96 (23:45)       QB, QBasic, PDS        853  21110    VIDPOK.BAS  DECLARE SUB getpress ()πpoker:πbet = 0πmoney = 10000πpoker2:πRANDOMIZE TIMERπCLSπPRINT ""πPRINT "                  **    Video Poker    **"πPRINT "==========================================================="πPRINT ""πPRINT "               Your current bet is $"; betπPRINT ""πPRINT "                    [1]  Bet (required)"πPRINT "                    [2]  View Payouts"πPRINT "                    [3]  Deal Cards"πPRINT "                    [4]  Quit"πPRINT "             (answer using number)"πDOπINPUT "                    ? ", vidpoker%πLOOP UNTIL vidpoker% > 0 AND vidpoker% < 5πIF vidpoker% = 4 THEN ENDπplacebet:πIF vidpoker% = 1 THENπ  CLSπ  PRINT ""π  PRINT "                  **    Video Poker    **"π  PRINT "==========================================================="π  PRINT ""π  PRINT "     Maximum bet of $ 1000"π  PRINT "     You only have $"; moneyπ  INPUT "     How much would you like to bet?  $", betπ  IF bet > money THEN PRINT "": PRINT "     You don't have that much.": bet = 0: getpress: GOTO placebetπ  IF bet > 1000 THEN PRINT "    That is over the maximum bet.": bet = 0: getpress: GOTO placebetπ  GOTO poker2πEND IFπππIF vidpoker% = 2 THENπ  CLSπ  PRINT "                  **    Video Poker    **"π  PRINT "==========================================================="π  PRINT ""π  PRINT "               Payouts"π  IF bet = 0 THEN PRINT "": PRINT "       You must place a bet first.": getpress: GOTO poker2π  PRINT ""π  PRINT "   Five of a kind ... $"; (bet * 1000)π  PRINT "   Royal Flush ...... $"; (bet * 400)π  PRINT "   Straight Flush ... $"; (bet * 200)π  PRINT "   Four of a kind ... $"; (bet * 100)π  PRINT "   Full House ....... $"; (bet * 30)π  PRINT "   Flush ............ $"; (bet * 20)π  PRINT "   Straight ......... $"; (bet * 10)π  PRINT "   Three of a kind .. $"; (bet * 5)π  PRINT "   Two Pair ......... $"; (bet * 3)π  PRINT "   Jacks or better .. $"; betπ  getpressπ  GOTO poker2πEND IFππIF bet = 0 THENπ  CLSπ  PRINT ""π  PRINT "                  **    Video Poker    **"π  PRINT "==========================================================="π  PRINT ""π  PRINT "                You Must Place a bet first."π  getpressπ  GOTO poker2πEND IFππpkrdeal:πCOLOR 7, 0πCLSπPRINT ""πPRINT "                  **    Video Poker    **"πPRINT "==========================================================="πPRINT "                      (Aces are high)"πPRINT ""πPRINT ""πPRINT ""πPRINT ""πPRINT ""πPRINT "           1        2        3        4        5"πPRINT ""πPRINT "       Type the number of the cards you want to Hold"πPRINT "                   Then [Space] to deal"πFOR dealcard# = 1 TO 7000: NEXT dealcard#πacard% = INT(RND * 13)πast% = INT(RND * 4)πIF ast% = 0 THEN acardst$ = ""πIF ast% = 1 THEN acardst$ = ""πIF ast% = 2 THEN acardst$ = ""πIF ast% = 3 THEN acardst$ = ""πbcard% = INT(RND * 13)πbst% = INT(RND * 4)πIF bst% = 0 THEN bcardst$ = ""πIF bst% = 1 THEN bcardst$ = ""πIF bst% = 2 THEN bcardst$ = ""πIF bst% = 3 THEN bcardst$ = ""πccard% = INT(RND * 13)πcst% = INT(RND * 4)πIF cst% = 0 THEN ccardst$ = ""πIF cst% = 1 THEN ccardst$ = ""πIF cst% = 2 THEN ccardst$ = ""πIF cst% = 3 THEN ccardst$ = ""πdcard% = INT(RND * 13)πdst% = INT(RND * 4)πIF dst% = 0 THEN dcardst$ = ""πIF dst% = 1 THEN dcardst$ = ""πIF dst% = 2 THEN dcardst$ = ""πIF dst% = 3 THEN dcardst$ = ""πecard% = INT(RND * 13)πest% = INT(RND * 4)πIF est% = 0 THEN ecardst$ = ""πIF est% = 1 THEN ecardst$ = ""πIF est% = 2 THEN ecardst$ = ""πIF est% = 3 THEN ecardst$ = ""ππdealem1:πIF acard% = 0 THEN acard$ = "2"πIF acard% = 1 THEN acard$ = "3"πIF acard% = 2 THEN acard$ = "4"πIF acard% = 3 THEN acard$ = "5"πIF acard% = 4 THEN acard$ = "6"πIF acard% = 5 THEN acard$ = "7"πIF acard% = 6 THEN acard$ = "8"πIF acard% = 7 THEN acard$ = "9"πIF acard% = 8 THEN acard$ = "10"πIF acard% = 9 THEN acard$ = "J"πIF acard% = 10 THEN acard$ = "Q"πIF acard% = 11 THEN acard$ = "K"πIF acard% = 12 THEN acard$ = "A"ππIF bcard% = 0 THEN bcard$ = "2"πIF bcard% = 1 THEN bcard$ = "3"πIF bcard% = 2 THEN bcard$ = "4"πIF bcard% = 3 THEN bcard$ = "5"πIF bcard% = 4 THEN bcard$ = "6"πIF bcard% = 5 THEN bcard$ = "7"πIF bcard% = 6 THEN bcard$ = "8"πIF bcard% = 7 THEN bcard$ = "9"πIF bcard% = 8 THEN bcard$ = "10"πIF bcard% = 9 THEN bcard$ = "J"πIF bcard% = 10 THEN bcard$ = "Q"πIF bcard% = 11 THEN bcard$ = "K"πIF bcard% = 12 THEN bcard$ = "A"ππIF ccard% = 0 THEN ccard$ = "2"πIF ccard% = 1 THEN ccard$ = "3"πIF ccard% = 2 THEN ccard$ = "4"πIF ccard% = 3 THEN ccard$ = "5"πIF ccard% = 4 THEN ccard$ = "6"πIF ccard% = 5 THEN ccard$ = "7"πIF ccard% = 6 THEN ccard$ = "8"πIF ccard% = 7 THEN ccard$ = "9"πIF ccard% = 8 THEN ccard$ = "10"πIF ccard% = 9 THEN ccard$ = "J"πIF ccard% = 10 THEN ccard$ = "Q"πIF ccard% = 11 THEN ccard$ = "K"πIF ccard% = 12 THEN ccard$ = "A"ππIF dcard% = 0 THEN dcard$ = "2"πIF dcard% = 1 THEN dcard$ = "3"πIF dcard% = 2 THEN dcard$ = "4"πIF dcard% = 3 THEN dcard$ = "5"πIF dcard% = 4 THEN dcard$ = "6"πIF dcard% = 5 THEN dcard$ = "7"πIF dcard% = 6 THEN dcard$ = "8"πIF dcard% = 7 THEN dcard$ = "9"πIF dcard% = 8 THEN dcard$ = "10"πIF dcard% = 9 THEN dcard$ = "J"πIF dcard% = 10 THEN dcard$ = "Q"πIF dcard% = 11 THEN dcard$ = "K"πIF dcard% = 12 THEN dcard$ = "A"ππIF ecard% = 0 THEN ecard$ = "2"πIF ecard% = 1 THEN ecard$ = "3"πIF ecard% = 2 THEN ecard$ = "4"πIF ecard% = 3 THEN ecard$ = "5"πIF ecard% = 4 THEN ecard$ = "6"πIF ecard% = 5 THEN ecard$ = "7"πIF ecard% = 6 THEN ecard$ = "8"πIF ecard% = 7 THEN ecard$ = "9"πIF ecard% = 8 THEN ecard$ = "10"πIF ecard% = 9 THEN ecard$ = "J"πIF ecard% = 10 THEN ecard$ = "Q"πIF ecard% = 11 THEN ecard$ = "K"πIF ecard% = 12 THEN ecard$ = "A"ππ'displays the cardsππCOLOR 7, 0πLOCATE 5, 9πPRINT "███████"πLOCATE 6, 9πPRINT "███████"πLOCATE 7, 9πPRINT "███████"πLOCATE 8, 9πPRINT "███████"πLOCATE 9, 9πPRINT "███████"πIF ast% < 2 THEN COLOR 4, 15πIF ast% > 1 THEN COLOR 0, 15πLOCATE 6, 10πPRINT acard$πIF acard$ = "10" THEN LOCATE 8, 13: PRINT acard$:  ELSE LOCATE 8, 14: PRINT acard$πLOCATE 7, 12πPRINT acardst$πFOR dealcard# = 1 TO 7000: NEXT dealcard#ππCOLOR 7, 0πLOCATE 5, 18πPRINT "███████"πLOCATE 6, 18πPRINT "███████"πLOCATE 7, 18πPRINT "███████"πLOCATE 8, 18πPRINT "███████"πLOCATE 9, 18πPRINT "███████"πIF bst% < 2 THEN COLOR 4, 15πIF bst% > 1 THEN COLOR 0, 15πLOCATE 6, 19πPRINT bcard$πIF bcard$ = "10" THEN LOCATE 8, 22: PRINT bcard$:  ELSE LOCATE 8, 23: PRINT bcard$πLOCATE 7, 21πPRINT bcardst$πFOR dealcard# = 1 TO 7000: NEXT dealcard#ππCOLOR 7, 0πLOCATE 5, 27πPRINT "███████"πLOCATE 6, 27πPRINT "███████"πLOCATE 7, 27πPRINT "███████"πLOCATE 8, 27πPRINT "███████"πLOCATE 9, 27πPRINT "███████"πIF cst% < 2 THEN COLOR 4, 15πIF cst% > 1 THEN COLOR 0, 15πLOCATE 6, 28πPRINT ccard$πIF ccard$ = "10" THEN LOCATE 8, 31: PRINT ccard$:  ELSE LOCATE 8, 32: PRINT ccard$πLOCATE 7, 30πPRINT ccardst$πFOR dealcard# = 1 TO 7000: NEXT dealcard#ππCOLOR 7, 0πLOCATE 5, 36πPRINT "███████"πLOCATE 6, 36πPRINT "███████"πLOCATE 7, 36πPRINT "███████"πLOCATE 8, 36πPRINT "███████"πLOCATE 9, 36πPRINT "███████"πIF dst% < 2 THEN COLOR 4, 15πIF dst% > 1 THEN COLOR 0, 15πLOCATE 6, 37πPRINT dcard$πIF dcard$ = "10" THEN LOCATE 8, 40: PRINT dcard$:  ELSE LOCATE 8, 41: PRINT dcard$πLOCATE 7, 39πPRINT dcardst$πFOR dealcard# = 1 TO 7000: NEXT dealcard#ππCOLOR 7, 0πLOCATE 5, 45πPRINT "███████"πLOCATE 6, 45πPRINT "███████"πLOCATE 7, 45πPRINT "███████"πLOCATE 8, 45πPRINT "███████"πLOCATE 9, 45πPRINT "███████"πIF est% < 2 THEN COLOR 4, 15πIF est% > 1 THEN COLOR 0, 15πLOCATE 6, 46πPRINT ecard$πIF ecard$ = "10" THEN LOCATE 8, 49: PRINT ecard$:  ELSE LOCATE 8, 50: PRINT ecard$πLOCATE 7, 48πPRINT ecardst$ππkeepa$ = "no"πkeepb$ = "no"πkeepc$ = "no"πkeepd$ = "no"πkeepe$ = "no"πππDOπholdcard$ = INKEY$πIF holdcard$ = CHR$(49) THENπ IF keepa$ = "yes" THENπ  LOCATE 10, 9π  COLOR 7, 0π  PRINT "   1   "π  keepa$ = "no"π  ELSEπ   LOCATE 10, 9π   COLOR 4, 0π   PRINT "[HELD]"π   keepa$ = "yes"π END IFπEND IFππIF holdcard$ = CHR$(50) THENπ IF keepb$ = "yes" THENπ  LOCATE 10, 18π  COLOR 7, 0π  PRINT "   2   "π  keepb$ = "no"π  ELSEπ   LOCATE 10, 18π   COLOR 4, 0π   PRINT "[HELD]"π   keepb$ = "yes"π END IFπEND IFππIF holdcard$ = CHR$(51) THENπ IF keepc$ = "yes" THENπ  LOCATE 10, 27π  COLOR 7, 0π  PRINT "   3   "π  keepc$ = "no"π  ELSEπ   LOCATE 10, 27π   COLOR 4, 0π   PRINT "[HELD]"π   keepc$ = "yes"π END IFπEND IFππIF holdcard$ = CHR$(52) THENπ IF keepd$ = "yes" THENπ  LOCATE 10, 36π  COLOR 7, 0π  PRINT "   4   "π  keepd$ = "no"π  ELSEπ   LOCATE 10, 36π   COLOR 4, 0π   PRINT "[HELD]"π   keepd$ = "yes"π END IFπEND IFππIF holdcard$ = CHR$(53) THENπ IF keepe$ = "yes" THENπ  LOCATE 10, 45π  COLOR 7, 0π  PRINT "   5   "π  keepe$ = "no"π  ELSEπ   LOCATE 10, 45π   COLOR 4, 0π   PRINT "[HELD]"π   keepe$ = "yes"π END IFπEND IFππLOOP WHILE holdcard$ <> CHR$(32)ππFOR dealstop# = 1 TO 7000: NEXT dealstop#ππIF keepa$ = "no" THENπ    acard% = INT(RND * 13)π    ast% = INT(RND * 4)π    IF ast% = 0 THEN acardst$ = ""π    IF ast% = 1 THEN acardst$ = ""π    IF ast% = 2 THEN acardst$ = ""π    IF ast% = 3 THEN acardst$ = ""π    COLOR 7, 0π    LOCATE 5, 9π    PRINT "       "π    LOCATE 6, 9π    PRINT "       "π    LOCATE 7, 9π    PRINT "       "π    LOCATE 8, 9π    PRINT "       "π    LOCATE 9, 9π    PRINT "       "π    FOR dealstop# = 1 TO 5000: NEXT dealstop#π    IF acard% = 0 THEN acard$ = "2"π    IF acard% = 1 THEN acard$ = "3"π    IF acard% = 2 THEN acard$ = "4"π    IF acard% = 3 THEN acard$ = "5"π    IF acard% = 4 THEN acard$ = "6"π    IF acard% = 5 THEN acard$ = "7"π    IF acard% = 6 THEN acard$ = "8"π    IF acard% = 7 THEN acard$ = "9"π    IF acard% = 8 THEN acard$ = "10"π    IF acard% = 9 THEN acard$ = "J"π    IF acard% = 10 THEN acard$ = "Q"π    IF acard% = 11 THEN acard$ = "K"π    IF acard% = 12 THEN acard$ = "A"π    COLOR 7, 0π    LOCATE 5, 9π    PRINT "███████"π    LOCATE 6, 9π    PRINT "███████"π    LOCATE 7, 9π    PRINT "███████"π    LOCATE 8, 9π    PRINT "███████"π    LOCATE 9, 9π    PRINT "███████"π    IF ast% < 2 THEN COLOR 4, 15π    IF ast% > 1 THEN COLOR 0, 15π    LOCATE 6, 10π    PRINT acard$π    IF acard$ = "10" THEN LOCATE 8, 13: PRINT acard$:  ELSE LOCATE 8, 14: PRINT acard$π    LOCATE 7, 12π    PRINT acardst$π    FOR dealcard# = 1 TO 7000: NEXT dealcard#πEND IFππIF keepb$ = "no" THENπ    bcard% = INT(RND * 13)π    bst% = INT(RND * 4)π    IF bst% = 0 THEN bcardst$ = ""π    IF bst% = 1 THEN bcardst$ = ""π    IF bst% = 2 THEN bcardst$ = ""π    IF bst% = 3 THEN bcardst$ = ""π    COLOR 7, 0π    LOCATE 5, 18π    PRINT "       "π    LOCATE 6, 18π    PRINT "       "π    LOCATE 7, 18π    PRINT "       "π    LOCATE 8, 18π    PRINT "       "π    LOCATE 9, 18π    PRINT "       "π    FOR dealstop# = 1 TO 5000: NEXT dealstop#π    IF bcard% = 0 THEN bcard$ = "2"π    IF bcard% = 1 THEN bcard$ = "3"π    IF bcard% = 2 THEN bcard$ = "4"π    IF bcard% = 3 THEN bcard$ = "5"π    IF bcard% = 4 THEN bcard$ = "6"π    IF bcard% = 5 THEN bcard$ = "7"π    IF bcard% = 6 THEN bcard$ = "8"π    IF bcard% = 7 THEN bcard$ = "9"π    IF bcard% = 8 THEN bcard$ = "10"π    IF bcard% = 9 THEN bcard$ = "J"π    IF bcard% = 10 THEN bcard$ = "Q"π    IF bcard% = 11 THEN bcard$ = "K"π    IF bcard% = 12 THEN bcard$ = "A"π    COLOR 7, 0π    LOCATE 5, 18π    PRINT "███████"π    LOCATE 6, 18π    PRINT "███████"π    LOCATE 7, 18π    PRINT "███████"π    LOCATE 8, 18π    PRINT "███████"π    LOCATE 9, 18π    PRINT "███████"π    IF bst% < 2 THEN COLOR 4, 15π    IF bst% > 1 THEN COLOR 0, 15π    LOCATE 6, 19π    PRINT bcard$π    IF bcard$ = "10" THEN LOCATE 8, 22: PRINT bcard$:  ELSE LOCATE 8, 23: PRINT bcard$π    LOCATE 7, 21π    PRINT bcardst$π    FOR dealcard# = 1 TO 7000: NEXT dealcard#πEND IFππIF keepc$ = "no" THENπ    ccard% = INT(RND * 13)π    cst% = INT(RND * 4)π    IF cst% = 0 THEN ccardst$ = ""π    IF cst% = 1 THEN ccardst$ = ""π    IF cst% = 2 THEN ccardst$ = ""π    IF cst% = 3 THEN ccardst$ = ""π    COLOR 7, 0π    LOCATE 5, 27π    PRINT "       "π    LOCATE 6, 27π    PRINT "       "π    LOCATE 7, 27π    PRINT "       "π    LOCATE 8, 27π    PRINT "       "π    LOCATE 9, 27π    PRINT "       "π    FOR dealstop# = 1 TO 5000: NEXT dealstop#π    IF ccard% = 0 THEN ccard$ = "2"π    IF ccard% = 1 THEN ccard$ = "3"π    IF ccard% = 2 THEN ccard$ = "4"π    IF ccard% = 3 THEN ccard$ = "5"π    IF ccard% = 4 THEN ccard$ = "6"π    IF ccard% = 5 THEN ccard$ = "7"π    IF ccard% = 6 THEN ccard$ = "8"π    IF ccard% = 7 THEN ccard$ = "9"π    IF ccard% = 8 THEN ccard$ = "10"π    IF ccard% = 9 THEN ccard$ = "J"π    IF ccard% = 10 THEN ccard$ = "Q"π    IF ccard% = 11 THEN ccard$ = "K"π    IF ccard% = 12 THEN ccard$ = "A"π    COLOR 7, 0π    LOCATE 5, 27π    PRINT "███████"π    LOCATE 6, 27π    PRINT "███████"π    LOCATE 7, 27π    PRINT "███████"π    LOCATE 8, 27π    PRINT "███████"π    LOCATE 9, 27π    PRINT "███████"π    IF cst% < 2 THEN COLOR 4, 15π    IF cst% > 1 THEN COLOR 0, 15π    LOCATE 6, 28π    PRINT ccard$π    IF ccard$ = "10" THEN LOCATE 8, 31: PRINT ccard$:  ELSE LOCATE 8, 32: PRINT ccard$π    LOCATE 7, 30π    PRINT ccardst$π    FOR dealcard# = 1 TO 7000: NEXT dealcard#πEND IFππIF keepd$ = "no" THENπ    dcard% = INT(RND * 13)π    dst% = INT(RND * 4)π    IF dst% = 0 THEN dcardst$ = ""π    IF dst% = 1 THEN dcardst$ = ""π    IF dst% = 2 THEN dcardst$ = ""π    IF dst% = 3 THEN dcardst$ = ""π    COLOR 7, 0π    LOCATE 5, 36π    PRINT "       "π    LOCATE 6, 36π    PRINT "       "π    LOCATE 7, 36π    PRINT "       "π    LOCATE 8, 36π    PRINT "       "π    LOCATE 9, 36π    PRINT "       "π    FOR dealstop# = 1 TO 5000: NEXT dealstop#π    IF dcard% = 0 THEN dcard$ = "2"π    IF dcard% = 1 THEN dcard$ = "3"π    IF dcard% = 2 THEN dcard$ = "4"π    IF dcard% = 3 THEN dcard$ = "5"π    IF dcard% = 4 THEN dcard$ = "6"π    IF dcard% = 5 THEN dcard$ = "7"π    IF dcard% = 6 THEN dcard$ = "8"π    IF dcard% = 7 THEN dcard$ = "9"π    IF dcard% = 8 THEN dcard$ = "10"π    IF dcard% = 9 THEN dcard$ = "J"π    IF dcard% = 10 THEN dcard$ = "Q"π    IF dcard% = 11 THEN dcard$ = "K"π    IF dcard% = 12 THEN dcard$ = "A"π    COLOR 7, 0π    LOCATE 5, 36π    PRINT "███████"π    LOCATE 6, 36π    PRINT "███████"π    LOCATE 7, 36π    PRINT "███████"π    LOCATE 8, 36π    PRINT "███████"π    LOCATE 9, 36π    PRINT "███████"π    IF dst% < 2 THEN COLOR 4, 15π    IF dst% > 1 THEN COLOR 0, 15π    LOCATE 6, 37π    PRINT dcard$π    IF dcard$ = "10" THEN LOCATE 8, 40: PRINT dcard$:  ELSE LOCATE 8, 41: PRINT dcard$π    LOCATE 7, 39π    PRINT dcardst$π    FOR dealcard# = 1 TO 7000: NEXT dealcard#πEND IFππIF keepe$ = "no" THENπ    ecard% = INT(RND * 13)π    est% = INT(RND * 4)π    IF est% = 0 THEN ecardst$ = ""π    IF est% = 1 THEN ecardst$ = ""π    IF est% = 2 THEN ecardst$ = ""π    IF est% = 3 THEN ecardst$ = ""π    COLOR 7, 0π    LOCATE 5, 45π    PRINT "       "π    LOCATE 6, 45π    PRINT "       "π    LOCATE 7, 45π    PRINT "       "π    LOCATE 8, 45π    PRINT "       "π    LOCATE 9, 45π    PRINT "       "π    FOR dealstop# = 1 TO 5000: NEXT dealstop#π    IF ecard% = 0 THEN ecard$ = "2"π    IF ecard% = 1 THEN ecard$ = "3"π    IF ecard% = 2 THEN ecard$ = "4"π    IF ecard% = 3 THEN ecard$ = "5"π    IF ecard% = 4 THEN ecard$ = "6"π    IF ecard% = 5 THEN ecard$ = "7"π    IF ecard% = 6 THEN ecard$ = "8"π    IF ecard% = 7 THEN ecard$ = "9"π    IF ecard% = 8 THEN ecard$ = "10"π    IF ecard% = 9 THEN ecard$ = "J"π    IF ecard% = 10 THEN ecard$ = "Q"π    IF ecard% = 11 THEN ecard$ = "K"π    IF ecard% = 12 THEN ecard$ = "A"π    COLOR 7, 0π    LOCATE 5, 45π    PRINT "███████"π    LOCATE 6, 45π    PRINT "███████"π    LOCATE 7, 45π    PRINT "███████"π    LOCATE 8, 45π    PRINT "███████"π    LOCATE 9, 45π    PRINT "███████"π    IF est% < 2 THEN COLOR 4, 15π    IF est% > 1 THEN COLOR 0, 15π    LOCATE 6, 46π    PRINT ecard$π    IF ecard$ = "10" THEN LOCATE 8, 49: PRINT ecard$:  ELSE LOCATE 8, 50: PRINT ecard$π    LOCATE 7, 48π    PRINT ecardst$π    FOR dealcard# = 1 TO 7000: NEXT dealcard#πEND IFππDOπtempa% = acard%πtempb% = bcard%πtempc% = ccard%πtempd% = dcard%πtempe% = ecard%πacard% = tempb%πbcard% = tempc%πccard% = tempd%πdcard% = tempe%πecard% = tempa%πLOOP UNTIL acard% <= bcard% AND acard% <= ccard% AND acard% <= dcard% AND acard% <= ecard%πππDOπtempb% = bcard%πtempc% = ccard%πtempd% = dcard%πtempe% = ecard%πbcard% = tempc%πccard% = tempd%πdcard% = tempe%πecard% = tempb%πLOOP UNTIL bcard% <= ccard% AND bcard% <= dcard% AND bcard% <= ecard%π πDOπtempc% = ccard%πtempd% = dcard%πtempe% = ecard%πccard% = tempd%πdcard% = tempe%πecard% = tempc%πLOOP UNTIL ccard% <= dcard% AND ccard% <= ecard%π  πDOπtempd% = dcard%πtempe% = ecard%πdcard% = tempe%πecard% = tempd%πLOOP UNTIL dcard% <= ecard%ππIF acard% = bcard% AND acard% = ccard% AND acard% = dcard% AND acard% = ecard% THENπ LOCATE 15, 20π COLOR 7, 0π PRINT "Five of a kind, you win $"; (bet * 1000)π money = money + (bet * 1000)π GOTO payupπEND IFππIF acard% = 8 AND bcard% = 9 AND ccard% = 10 AND dcard% = 11 AND ecard% = 12 AND acardst$ = bcardst$ AND acardst$ = ccardst$ AND acardst$ = dcardst$ AND acardst$ = ecardst$ THENπ LOCATE 15, 20π COLOR 7, 0π PRINT "Royal Flush, you win $"; (bet * 400)π money = money + (bet * 400)π GOTO payupπEND IFππIF ecard% = 1 + dcard% AND dcard% = 1 + ccard% AND ccard% = 1 + bcard% AND bcard% = 1 + acard AND ast% = bst% AND ast% = cst% AND ast% = dst% AND ast% = est% THENπ LOCATE 15, 20π COLOR 7, 0π PRINT "Straight Flush, you win $"; (bet * 200)π money = money + (bet * 200)π GOTO payupπEND IFππIF acard% = bcard% AND acard% = ccard% AND acard% = dcard% THENπ LOCATE 15, 20π COLOR 7, 0π PRINT "Four of a kind, you win $"; (bet * 100)π money = money + (bet * 100)π GOTO payupπEND IFππIF bcard% = ccard% AND bcard% = dcard% AND bcard% = ecard% THENπ LOCATE 15, 20π COLOR 7, 0π PRINT "Four of a kind, you win $"; (bet * 100)π money = money + (bet * 100)π GOTO payupπEND IFππIF acard% = bcard% AND acard% = ccard% AND dcard% = ecard% THENπ LOCATE 15, 20π COLOR 7, 0π PRINT "Full House, you win $"; (bet * 30)π money = money + (bet * 30)π GOTO payupπEND IFππIF acard% = bcard% AND ccard% = dcard% AND ccard% = ecard% THENπ LOCATE 15, 20π COLOR 7, 0π PRINT "Full House, you win $"; (bet * 30)π money = money + (bet * 30)π GOTO payupπEND IFππIF ast% = bst% AND ast% = cst% AND ast% = dst% AND ast% = est% THENπ LOCATE 15, 20π COLOR 7, 0π PRINT "Flush, you win $"; (bet * 20)π money = money + (bet * 20)π GOTO payupπEND IFππIF ecard% = 1 + dcard% AND dcard% = 1 + ccard% AND ccard% = 1 + bcard% AND bcard% = 1 + acard% THENπ LOCATE 15, 20π COLOR 7, 0π PRINT "Straight, you win $"; (bet * 10)π money = money + (bet * 10)π GOTO payupπEND IFππIF acard% = bcard% AND acard% = ccard% THENπ LOCATE 15, 20π COLOR 7, 0π PRINT "Three of a kind, you win $"; (bet * 5)π money = money + (bet * 5)π GOTO payupπEND IFππIF bcard% = ccard% AND bcard% = dcard% THENπ LOCATE 15, 20π COLOR 7, 0π PRINT "Three of a kind, you win $"; (bet * 5)π money = money + (bet * 5)π GOTO payupπEND IFππIF ccard% = dcard% AND ccard% = ecard% THENπ LOCATE 15, 20π COLOR 7, 0π PRINT "Three of a kind, you win $"; (bet * 5)π money = money + (bet * 5)π GOTO payupπEND IFππIF acard% = bcard% AND ccard% = dcard% THENπ LOCATE 15, 20π COLOR 7, 0π PRINT "Two Pair, you win $"; (bet * 3)π money = money + (bet * 3)π GOTO payupπEND IFππIF acard% = bcard% AND dcard% = ecard% THENπ LOCATE 15, 20π COLOR 7, 0π PRINT "Two Pair, you win $"; (bet * 3)π money = money + (bet * 3)π GOTO payupπEND IFππIF bcard% = ccard% AND dcard% = ecard% THENπ LOCATE 15, 20π COLOR 7, 0π PRINT "Two Pair, you win $"; (bet * 3)π money = money + (bet * 3)π GOTO payupπEND IFππIF acard% = bcard% THENπ  IF acard% > 8 THENπ    LOCATE 15, 18π    COLOR 7, 0π    PRINT "Jacks or Better, you win $"; betπ    GOTO payupπ  END IFπEND IFππIF bcard% = ccard% THENπ  IF bcard% > 8 THENπ    LOCATE 15, 18π    COLOR 7, 0π    PRINT "Jacks or Better, you win $"; betπ    GOTO payupπ  END IFπEND IFππIF ccard% = dcard% THENπ  IF ccard% > 8 THENπ    LOCATE 15, 18π    COLOR 7, 0π    PRINT "Jacks or Better, you win $"; betπ    GOTO payupπ  END IFπEND IFππIF dcard% = ecard% THENπ  IF dcard% > 8 THENπ    LOCATE 15, 18π    COLOR 7, 0π    PRINT "Jacks or Better, you win $"; betπ    GOTO payupπ  END IFπEND IFππLOCATE 15, 18πCOLOR 7, 0πPRINT "You lose your bet of $"; betπmoney = money - betππpayup:πLOCATE 17, 15πPRINT "Deal again to bet the same amount"πgetpressπGOTO poker2ππSUB getpressπDOπa$ = INKEY$πLOOP UNTIL a$ <> ""πEND SUBππAdam Stanchos                  RED BARON 2573                 pages.prodigy.com/gamersp      04-06-96 (00:00)       QB, QBasic, PDS        1282 48034    REDBARON.BAS'For best play performance, compile Red Baron into an .EXE!π'Reply with any comments or questions and enjoy the game!  π'Red Baron 2573.  Programmed by Adam Stanchos              π'On Prodigy:  TCMP46B    On AOL:  AdamS60982               πDECLARE SUB Sunset (rxpos%, rypos%)πDECLARE SUB ExtraShipCheck (Score%, Ships%, GainShip%)πDECLARE SUB EnMove (n%, ShipType%)πDECLARE SUB EnemyShipPicture (n%, ShipType%)πDECLARE SUB Statistics (Score%, Ships%)πDECLARE SUB ExplosiveSound ()πDECLARE SUB Explosion (X%, Y%)πDECLARE SUB UpRight (X%, Y%)πDECLARE SUB UpLeft (X%, Y%)πDECLARE SUB DownLeft (X%, Y%)πDECLARE SUB DownRight (X%, Y%)πDECLARE SUB MoveLeft (X%)πDECLARE SUB MoveUp (Y%)πDECLARE SUB MoveDown (Y%)πDECLARE SUB RedBaron ()πDECLARE SUB RedShip ()πDECLARE SUB RedShipMask ()πDECLARE SUB EFighter ()πDECLARE SUB EFighterMask ()πDECLARE SUB EElite ()πDECLARE SUB EEliteMask ()πDECLARE SUB ECommandShip ()πDECLARE SUB ECommandShipMask ()πDECLARE SUB PrivateASCII ()πDECLARE SUB MoveRight (X%)πDECLARE SUB stars ()πDECLARE SUB MainScreen (HScore%, ASCII%)πDECLARE SUB HelpScreen ()πDECLARE SUB Intro ()πDECLARE SUB Conclusion ()πDECLARE SUB Keypad ()πDECLARE SUB Title ()πDECLARE SUB WaveInfo (Wave%, NumberofShips%, Score%, Ships%)πDECLARE SUB YouLose (Score%, Ships%)πDEFINT A-Zπ  SCREEN 7, 0, 2, 0π    DEF SEG = &HA000π    DIM SHARED RShip%(1 TO 500), RShipMask%(1 TO 500)ππ    DIM SHARED EFShip%(1 TO 500), EFShipMask%(1 TO 500)π    DIM SHARED EEShip%(1 TO 500), EEShipMask%(1 TO 500)π    DIM SHARED ECShip%(1 TO 1500), ECShipMask%(1 TO 1500)π    DIM SHARED ASCII%(1 TO 500)π      CALL RedShip: CALL RedShipMaskπ      CALL EFighter: CALL EFighterMaskπ      CALL EElite: CALL EEliteMaskπ      CALL ECommandShip: CALL ECommandShipMaskπ      CALL PrivateASCIIπ    DEF FNR (X) = INT(RND * X) + 1π    DIM SHARED SX(20), SY(20), ST(20)π      FOR I = 1 TO 20  'sprinkle some stars                π        SX(I) = FNR(319): SY(I) = FNR(199)π        ST(I) = FNR(2)π      NEXTπ    DIM SHARED EX(5), EY(5), Laser(5), Enemy(5), Eshot(5)π    HScore% = 0π    SCREEN 7, 0, 1, 0πLetsStart:                                                 π    CLSπ    Score% = 0: Ships% = 3: X% = 150: Y% = 170: ASCII% = 0π    Defeated = 0: Wave = 1: ShipPoints% = 5: GainShip = 0π    CALL MainScreen(HScore%, ASCII%)πDetermineWave:                                             π    IF Ships% < 1 AND Score% > HScore% THENπ      HScore% = Score%π    END IFπ    IF Ships% < 1 THENπ      CALL YouLose(Score%, Ships%): GOTO LetsStartπ    END IFπ    IF Wave > 25 THENπ      CALL Conclusionπ      IF Score% > HScore% THEN HScore% = Score%π      GOTO LetsStartπ    END IFπ'------                                                    π    IF ASCII% = 1 THENπ      RangeLeft = 24: RangeRight = 25: ELXC = 23: ELYC = 16π      Wave = 0: ShipPoints% = 100: ShipType = 4: OutOf = 20π    END IFπ    IF Wave = 1 THENπ      RangeLeft = 24: RangeRight = 25: ELXC = 23: ELYC = 16π      ShipPoints% = 5: ShipType = 1: OutOf = 20π    END IFπ    IF Wave = 15 THENπ      RangeLeft = 24: RangeRight = 25: ELXC = 23: ELYC = 16π      ShipPoints% = 10: ShipType = 2: OutOf = 1π    END IFπ    IF Wave = 16 THENπ      RangeLeft = 24: RangeRight = 25: ELXC = 23: ELYC = 16π      ShipPoints% = 5: ShipType = 1: OutOf = 20π    END IFπ    IF Wave = 17 THENπ      RangeLeft = 24: RangeRight = 25: ELXC = 23: ELYC = 16π      ShipPoints% = 10: ShipType = 2: OutOf = 1ππ    END IFπ    IF Wave = 20 THENπ      RangeLeft = 24: RangeRight = 25: ELXC = 23: ELYC = 16π      ShipPoints% = 5: ShipType = 1: OutOf = 20π    END IFπ    IF Wave = 21 THENπ      RangeLeft = 24: RangeRight = 25: ELXC = 23: ELYC = 16π      ShipPoints% = 10: ShipType = 2: OutOf = 1π    END IFπ    IF Wave = 25 THENπ      RangeLeft = 89: RangeRight = 90π      ELXC = 88: ELYC = 43: HitC = 0: PLAY "mbo1l4dl16cl2f"π      ShipPoints% = 50: ShipType = 3: OutOf = 1π    END IFπ    CALL WaveInfo(Wave, NumberofShips, Score%, Ships%)π      FOR n = 1 TO NumberofShipsπ        Laser(n) = -10: Enemy(n) = 1: EY(n) = 29π        Eshot(n) = 0π      NEXTπ    EX(1) = 137: EX(2) = 90: EX(3) = 200: EX(4) = 40π    EX(5) = 250: X% = 140: Y% = 170: RANDOMIZE TIMERπ    GOSUB Updateπ                                                            πKeyboardInput:                                             π  a$ = INKEY$π    IF a$ = CHR$(0) + CHR$(77) THENπ       CALL MoveRight(X%): GOSUB Updateπ       END IFπ    IF a$ = CHR$(0) + CHR$(75) THENπ       CALL MoveLeft(X%): GOSUB Updateπ       END IFπ    IF a$ = CHR$(0) + CHR$(72) THENπ       CALL MoveUp(Y%): GOSUB Updateπ       END IFπ    IF a$ = CHR$(0) + CHR$(80) THENπ       CALL MoveDown(Y%): GOSUB Updateπ       END IFπ    IF a$ = CHR$(0) + CHR$(73) THENπ       CALL UpRight(X%, Y%): GOSUB Updateπ       END IFπ    IF a$ = CHR$(0) + CHR$(71) THENπ       CALL UpLeft(X%, Y%): GOSUB Updateπ       END IFπ    IF a$ = CHR$(0) + CHR$(79) THENπ       CALL DownLeft(X%, Y%): GOSUB Updateπ       END IFπ    IF a$ = CHR$(0) + CHR$(81) THENπ       CALL DownRight(X%, Y%): GOSUB Updateπ       END IFπ    IF a$ = CHR$(32) THEN GOSUB Shootπ    IF a$ = "q" THEN Ships% = 0: GOTO DetermineWaveπ  GOSUB PlaceEShipπ    IF Lostaship = 1 THENπ      Lostaship = 0: Defeated = 0: GOTO DetermineWaveπ      END IFππ    IF Defeated = NumberofShips THENπ      Defeated = 0: Wave = Wave + 1: GOTO DetermineWaveπ      END IFπ  GOTO KeyboardInputπ                                                            πUpdate:                                                    π  SCREEN 7, 0, 2, 0: PCOPY 1, 2π  CALL starsπ  PUT (X%, Y%), RShipMask%, ANDπ  PUT (X%, Y%), RShip%, XORπ    FOR n = 1 TO NumberofShipsπ      IF Enemy(n) = 0 THEN GOTO DoneWithItπ      CALL EnemyShipPicture(n, ShipType)π  IF Eshot(n) = 1 THEN GOSUB EShoot 'lasers be shown?      πDoneWithIt:                                                π    NEXTπ    CALL Statistics(Score%, Ships%)π  SCREEN 7, 0, 0, 0: PCOPY 2, 0: PCOPY 1, 2π  RETURNπ                                                            πPlaceEShip:                                                π  SCREEN 7, 0, 2, 0: PCOPY 1, 2π  CALL starsπ    FOR n = 1 TO NumberofShipsπ      IF Enemy(n) = 0 THEN GOTO DoneWithShip2π    CALL EnMove(n, ShipType)π      CALL EnemyShipPicture(n, ShipType)π      IF Eshot(n) = 1 THENπ        Laser(n) = Laser(n) + 5: GOSUB EShootπ        END IFπ    Doesitshoot = INT(RND * OutOf) + 1π      IF Doesitshoot = 1 AND Eshot(n) = 0 THENπ        Eshot(n) = 1: Laser(n) = EY(n) + ELYCπ        PLAY "o4mbl64 a": GOSUB EShootπ        END IFπDoneWithShip2:                                             π    NEXTπ  PUT (X, Y), RShipMask%, ANDπ  PUT (X, Y), RShip%, XORπ  CALL Statistics(Score%, Ships%)π      IF Lostaship = 1 THEN CALL Explosion(X%, Y%)π  SCREEN 7, 0, 0, 0: PCOPY 2, 0: PCOPY 1, 2π  RETURNπ                                                            πShoot:                                                     π  LINE (X + 7, Y + 5)-(X + 7, 8), 1π  LINE (X + 27, Y + 5)-(X + 27, 8), 1π  PLAY "o4mbl64 a b"π    FOR n = 1 TO NumberofShipsππ      IF X + 5 > EX(n) - 3 AND X + 5 < EX(n) + RangeLeft THENπ        FOR Grow = 1 TO 5π          CIRCLE (X + 7, EY(n) + 10), Grow, 14: NEXTπ        CALL ExplosiveSoundπ        FOR Grow = 6 TO 8ππ          CIRCLE (X + 7, EY(n) + 10), Grow, 12: NEXTπ        FOR Grow = 9 TO 10π          CIRCLE (X + 7, EY(n) + 10), Grow, 4: NEXTπ            IF ShipType = 3 AND HitC > 100 THENπ              GOSUB YouKillMeBaby: RETURNπ            END IFπ            IF ShipType = 3 THENπ              HitC = HitC + 1: GOTO ShootPart2π            END IFπ        GOSUB YouKillMeBabyπ      END IF  '-Left laser cannon-                         ππShootPart2:                                                ππ      IF X + 26 > EX(n) - 2 AND X + 26 < EX(n) + RangeRight THENπ        FOR Grow = 1 TO 5π          CIRCLE (X + 27, EY(n) + 10), Grow, 14: NEXTπ        CALL ExplosiveSoundπ        FOR Grow = 6 TO 8π          CIRCLE (X + 27, EY(n) + 10), Grow, 12: NEXTπ        FOR Grow = 9 TO 10π          CIRCLE (X + 27, EY(n) + 10), Grow, 4: NEXTπ            IF ShipType = 3 AND HitC > 100 THENπ              GOSUB YouKillMeBaby: RETURNπ            END IFπ            IF ShipType = 3 THEN HitC = HitC + 1: RETURNπ        GOSUB YouKillMeBabyπ      END IF  '-Right laser cannon-                        π    NEXTπ  RETURNπ                                                            πYouKillMeBaby:                                             π  EX(n) = -10: EY(n) = -10: Enemy(n) = 0π  Score% = Score% + ShipPoints%π  Defeated = Defeated + 1π  CALL ExtraShipCheck(Score%, Ships%, GainShip%)πRETURNπ                                                            πEShoot:                                                    π  LINE (EX(n) + 2, Laser(n))-(EX(n) + 2, Laser(n) + 5), 4ππ  LINE (EX(n) + ELXC, Laser(n))-(EX(n) + ELXC, Laser(n) + 5), 4ππ    IF Eshot(n) = 1 AND EX(n) + 2 > X - 1 AND EX(n) + 2 < X + 35 AND Laser(n) > Y - 1 AND Laser(n) < Y + 12 THENπ      Ships% = Ships% - 1: Lostaship = 1: RETURNπ    END IF 'right laser cannon                             π                                                            πππ    IF Eshot(n) = 1 AND EX(n) + ELXC > X - 1 AND EX(n) + ELXC < X + 35 AND Laser(n) > Y - 1 AND Laser(n) < Y + 12 THENπ      Ships% = Ships% - 1: Lostaship = 1: RETURNπ    END IF 'left laser cannon                              π    IF ShipType = 3 THEN GOSUB ExtraShootπ  IF Eshot(n) = 1 AND Laser(n) > 209 THEN Eshot(n) = 0π  RETURNπ                                                            ππExtraShoot:                                                π  LINE (EX(n) + 17, Laser(n))-(EX(n) + 17, Laser(n) + 5), 1π  LINE (EX(n) + 73, Laser(n))-(EX(n) + 73, Laser(n) + 5), 1ππ    IF Eshot(n) = 1 AND EX(n) + 17 > X - 1 AND EX(n) + 2 < X + 35 AND Laser(n) > Y - 1 AND Laser(n) < Y + 12 THENπ      Ships% = Ships% - 1: Lostaship = 1: RETURNπ    END IF 'right laser cannon                             π                                                            ππ    IF Eshot(n) = 1 AND EX(n) + 73 > X - 1 AND EX(n) + 73 < X + 35 AND Laser(n) > Y - 1 AND Laser(n) < Y + 12 THENπ      Ships% = Ships% - 1: Lostaship = 1: RETURNπ    END IF 'left laser cannon                              π  IF Eshot(n) = 1 AND Laser(n) > 209 THEN Eshot(n) = 0πRETURNπ                                                            πSUB Conclusionπ  rxpos = 300: rypos = 80πConc1:                                                     π  FOR pause = 1 TO 10000: NEXTπ  SCREEN 7, 0, 2, 0π  CLS : CALL Sunset(rxpos, rypos)π  LOCATE 17, 1: COLOR 7π  PRINT "     Successfully destroying the evil"π  PRINT "Vordoxian fleet, you return to Earth."π  PRINT "Crowds cheer as they see your ship"π  PRINT "flying through the evening sky,"π  PRINT "realizing that the earth has been"π  PRINT "saved by the Red Baron!"π  SCREEN 7, 0, 0, 0: PCOPY 2, 0π   a$ = INKEY$π   IF a$ = CHR$(13) THEN GOTO ConclusionDoneπ   GOTO Conc1πConclusionDone:                                            πEND SUBππSUB DownLeft (X%, Y%)π  X% = X% - 5: Y% = Y% + 5π  IF X% < 20 THEN X% = 20π  IF Y% > 170 THEN Y% = 170πEND SUBππSUB DownRight (X%, Y%)π  X% = X% + 5: Y% = Y% + 5π  IF X% > 250 THEN X% = 250π  IF Y% > 170 THEN Y% = 170πEND SUBππSUB ECommandShipπ  CLSπ  LINE (50, 10)-(54, 50), 8, B: PAINT (51, 11), 7, 8π  LINE (52, 11)-(52, 49), 15π  PSET (52, 10), 7: PSET (52, 50), 7π  PSET (50, 10), 0: PSET (54, 10), 0π  LINE (55, 11)-(57, 11), 1: LINE (58, 12)-(78, 12), 1π  LINE (78, 12)-(78, 32), 1: LINE (78, 32)-(58, 32), 1ππ  LINE (58, 32)-(55, 35), 1: LINE (55, 35)-(55, 11), 1π  LINE (77, 12)-(77, 32), 1: PAINT (56, 12), 9, 1π  LINE (58, 31)-(76, 31), 11: PSET (57, 32), 11π  LINE (65, 15)-(70, 15), 4: LINE (65, 18)-(70, 18), 4π  LINE (65, 20)-(70, 20), 4: LINE (65, 20)-(70, 32), 4, BFπ  LINE (65, 31)-(70, 31), 12: PSET (77, 31), 9π  LINE (80, 8)-(90, 10), 8, B: PAINT (81, 9), 7, 8π  LINE (100, 8)-(110, 10), 8, B: PAINT (101, 9), 7, 8π  LINE (80, 12)-(80, 37), 1: LINE (80, 37)-(83, 40), 1π  LINE (83, 12)-(83, 40), 1: LINE (80, 12)-(83, 12), 1π  LINE (82, 12)-(82, 39), 1: PAINT (81, 13), 9, 1ππ  LINE (85, 11)-(85, 42), 1: LINE (85, 42)-(95, 52), 1π  LINE (85, 11)-(105, 11), 1: LINE (105, 11)-(105, 42), 1π  LINE (105, 42)-(95, 52), 1: PAINT (86, 12), 9, 1π  LINE (107, 12)-(107, 40), 1: LINE (108, 39)-(110, 37), 1π  LINE (110, 12)-(110, 36), 1: LINE (108, 12)-(110, 12), 1π  PAINT (109, 13), 9, 1: LINE (90, 12)-(90, 42), 1π  PSET (91, 43), 1: PSET (99, 43), 11π  LINE (92, 44)-(95, 44), 1: LINE (100, 12)-(100, 42), 11π  LINE (97, 44)-(98, 44), 11π  PSET (93, 41), 0: PSET (95, 41), 14π  PSET (94, 41), 6: PSET (96, 41), 15: PSET (97, 41), 0π  LINE (93, 40)-(97, 40), 0: LINE (94, 42)-(96, 42), 0π  LINE (112, 12)-(112, 32), 1: LINE (112, 12)-(132, 12), 1π  LINE (112, 32)-(132, 32), 1: LINE (133, 11)-(135, 11), 1π  LINE (135, 12)-(135, 35), 0: LINE (134, 11)-(134, 34), 1π  LINE (132, 32)-(135, 35), 1: PAINT (113, 13), 9, 1π  LINE (133, 11)-(133, 31), 1: LINE (114, 31)-(131, 31), 11π  LINE (120, 15)-(125, 15), 4: LINE (120, 18)-(125, 18), 4π  LINE (120, 20)-(125, 20), 4π  LINE (120, 20)-(125, 32), 4, BFπ  LINE (120, 31)-(125, 31), 12π  LINE (136, 10)-(140, 50), 8, Bπ  PAINT (137, 11), 7, 8: LINE (138, 11)-(138, 49), 15π  PSET (138, 10), 7: PSET (138, 50), 7π  PSET (136, 10), 0: PSET (140, 10), 0π  LINE (65, 33)-(69, 50), 8, B: PAINT (66, 34), 7, 8π  LINE (67, 34)-(67, 49), 15π  PSET (67, 33), 7: PSET (67, 50), 7π  LINE (121, 33)-(125, 50), 8, B: PAINT (122, 34), 7, 8π  LINE (123, 34)-(123, 49), 15π  PSET (123, 33), 7: PSET (123, 50), 7π  GET (50, 8)-(140, 53), ECShip%π  CLS 'clean up screen                                     πEND SUBππSUB ECommandShipMaskπ  CLSπ  LINE (50, 8)-(79, 8), 15: LINE (50, 9)-(79, 9), 15π  LINE (54, 10)-(79, 10), 15: LINE (58, 11)-(79, 11), 15π  PSET (50, 10), 15: PSET (140, 10), 15π  LINE (91, 8)-(99, 10), 15, BF: LINE (111, 8)-(140, 8), 15π  LINE (111, 9)-(140, 9), 15: LINE (111, 10)-(136, 10), 15π  LINE (111, 11)-(132, 11), 15: LINE (50, 53)-(140, 53), 15π  LINE (50, 51)-(50, 52), 15: LINE (140, 51)-(140, 52), 15ππ  LINE (94, 52)-(80, 38), 15: LINE (79, 37)-(79, 33), 15π  LINE (78, 33)-(70, 33), 15: LINE (70, 33)-(70, 51), 15π  LINE (70, 51)-(64, 51), 15: LINE (64, 51)-(64, 33), 15π  LINE (64, 33)-(58, 33), 15: LINE (58, 33)-(55, 36), 15π  LINE (55, 36)-(55, 51), 15: LINE (55, 51)-(50, 51), 15π  PAINT (56, 52), 15, 15π  LINE (96, 52)-(110, 38), 15: LINE (111, 37)-(111, 33), 15π  LINE (112, 33)-(120, 33), 15π  LINE (120, 33)-(120, 51), 15π  LINE (120, 51)-(126, 51), 15π  LINE (126, 51)-(126, 33), 15π  LINE (126, 33)-(132, 33), 15π  LINE (133, 34)-(135, 36), 15π  LINE (135, 37)-(135, 51), 15π  LINE (135, 51)-(140, 51), 15π  PAINT (100, 49), 15, 15π  GET (50, 8)-(140, 53), ECShipMask%π  CLS 'clean up screen                                     πEND SUBππSUB EEliteπ  CLSπ  LINE (140, 100)-(144, 115), 5, Bπ  LINE (165, 100)-(161, 115), 5, Bπ  LINE (145, 105)-(150, 100), 5π  LINE (145, 110)-(150, 115), 5π  LINE (160, 105)-(155, 100), 5π  LINE (160, 110)-(155, 115), 5π  LINE (150, 100)-(155, 100), 5π  LINE (150, 115)-(155, 115), 5π  PAINT (151, 101), 13, 5: PAINT (141, 101), 13, 5π  PAINT (162, 101), 13, 5π  LINE (142, 100)-(142, 115), 13π  LINE (142, 101)-(142, 114), 15π  LINE (163, 100)-(163, 115), 13π  LINE (163, 101)-(163, 114), 15π  LINE (150, 111)-(155, 111), 0π  LINE (150, 112)-(155, 112), 0π  LINE (151, 113)-(154, 113), 0π  LINE (151, 112)-(154, 112), 9π  PSET (151, 112), 1: PSET (153, 112), 11π  LINE (151, 103)-(154, 103), 5π  LINE (151, 105)-(154, 105), 5π  LINE (151, 107)-(154, 107), 5π  GET (140, 100)-(165, 115), EEShip%π  CLS 'clean up screen                                     πEND SUBππSUB EEliteMaskπ  CLSπ  LINE (145, 100)-(149, 100), 15π  LINE (145, 100)-(145, 104), 15π  LINE (145, 104)-(149, 100), 15: PAINT (146, 101), 15π  LINE (156, 100)-(160, 100), 15π  LINE (160, 100)-(160, 104), 15ππ  LINE (160, 104)-(156, 100), 15: PAINT (158, 101), 15π  LINE (145, 115)-(149, 115), 15π  LINE (145, 115)-(145, 111), 15π  LINE (145, 111)-(149, 115), 15: PAINT (146, 114), 15π  LINE (156, 115)-(160, 115), 15π  LINE (156, 115)-(160, 111), 15π  LINE (160, 111)-(160, 115), 15: PAINT (158, 114), 15π  GET (140, 100)-(165, 115), EEShipMask%π  CLS 'clean up screen                                     πEND SUBππSUB EFighterπ  CLSπ  LINE (150, 100)-(155, 100), 8π  LINE (149, 101)-(149, 109), 8π  LINE (156, 101)-(156, 109), 8π  LINE (148, 110)-(147, 111), 8π  LINE (157, 110)-(158, 111), 8π  LINE (145, 111)-(146, 111), 8π  LINE (159, 111)-(160, 111), 8π  LINE (140, 100)-(144, 115), 8, Bπ  LINE (165, 100)-(161, 115), 8, Bπ  LINE (145, 113)-(150, 115), 8π  LINE (151, 115)-(156, 115), 8π  LINE (157, 114)-(158, 114), 8π  LINE (159, 114)-(160, 113), 8π  PAINT (151, 101), 7, 8: PAINT (141, 101), 7, 8π  PAINT (162, 101), 7, 8π  LINE (142, 100)-(142, 115), 7π  LINE (142, 101)-(142, 114), 15π  LINE (163, 100)-(163, 115), 7π  LINE (163, 101)-(163, 114), 15π  LINE (150, 111)-(155, 111), 0π  LINE (150, 112)-(155, 112), 0π  LINE (151, 113)-(154, 113), 0π  LINE (151, 112)-(154, 112), 9π  PSET (151, 112), 1: PSET (153, 112), 11π  LINE (151, 103)-(154, 103), 8π  LINE (151, 105)-(154, 105), 8π  LINE (151, 107)-(154, 107), 8π  GET (140, 100)-(165, 115), EFShip%π  CLS 'clean up screen                                     πEND SUBππSUB EFighterMaskπ  CLSπ  LINE (145, 100)-(147, 110), 15, BFπ  LINE (148, 100)-(148, 109), 15π  LINE (158, 100)-(160, 110), 15, BFπ  LINE (157, 100)-(157, 109), 15π  LINE (145, 115)-(148, 115), 15π  LINE (157, 115)-(160, 115), 15π  PSET (145, 114), 15: PSET (160, 114), 15π  PSET (149, 100), 15: PSET (156, 100), 15π  GET (140, 100)-(165, 115), EFShipMask%ππ  CLS 'clean up screen                                     πEND SUBππSUB EnemyShipPicture (n, ShipType)π  IF ShipType = 1 THENπ    PUT (EX(n), EY(n)), EFShipMask%, ANDπ    PUT (EX(n), EY(n)), EFShip%, XORπ  END IFπ  IF ShipType = 2 THENπ    PUT (EX(n), EY(n)), EEShipMask%, ANDπ    PUT (EX(n), EY(n)), EEShip%, XORπ  END IFπ  IF ShipType = 3 THENπ    PUT (EX(n), EY(n)), ECShipMask%, ANDπ    PUT (EX(n), EY(n)), ECShip%, XORπ  END IFπ  IF ShipType = 4 THENπ    PUT (EX(n), EY(n)), ASCII%, PSETπ  END IFπEND SUBππSUB EnMove (n, ShipType)π  Direction = INT(RND * 8) + 1π  IF Direction = 1 THEN EY(n) = EY(n) - 5π  IF Direction = 2 THEN EX(n) = EX(n) + 5: EY(n) = EY(n) - 5π  IF Direction = 3 THEN EX(n) = EX(n) + 5π  IF Direction = 4 THEN EX(n) = EX(n) + 5: EY(n) = EY(n) + 5π  IF Direction = 5 THEN EY(n) = EY(n) - 5π  IF Direction = 6 THEN EX(n) = EX(n) - 5: EY(n) = EY(n) + 5π  IF Direction = 7 THEN EX(n) = EX(n) - 5π  IF Direction = 8 THEN EX(n) = EX(n) - 5: EY(n) = EY(n) - 5π    IF EX(n) < 20 THEN EX(n) = 20π    IF EX(n) > 250 THEN EX(n) = 250π      IF ShipType = 3 AND EX(n) > 200 THEN EX(n) = 200π    IF EY(n) < 15 THEN EY(n) = 15π    IF EY(n) > 100 THEN EY(n) = 100πEND SUBππSUB Explosion (X%, Y%)π  FOR Grow = 1 TO 5π    CIRCLE (X + 17, Y + 6), Grow, 14: NEXTπ    CALL ExplosiveSoundπ  FOR Grow = 6 TO 8π    CIRCLE (X + 17, Y + 6), Grow, 12: NEXTπ  FOR Grow = 9 TO 10π    CIRCLE (X + 17, Y + 6), Grow, 4: NEXTπEND SUBππSUB ExplosiveSoundπ  FOR s = 850 TO 810 STEP -1π  SOUND (RND * 100 + s / 10 + 30), .1π  NEXTπEND SUBππSUB ExtraShipCheck (Score%, Ships%, GainShip%)ππ    IF Score% >= 100 AND GainShip = 0 THENπ      Ships% = Ships% + 1: GainShip = 1π      GOSUB Toon: GOTO OutCheckπ    END IFπ    IF Score% >= 200 AND GainShip = 1 THENπ      Ships% = Ships% + 1: GainShip = 2π      GOSUB Toon: GOTO OutCheckπ    END IFπ    IF Score% >= 300 AND GainShip = 2 THENπ      Ships% = Ships% + 1: GainShip = 3π      GOSUB Toon: GOTO OutCheckπ    END IFπ    IF Score% >= 400 AND GainShip = 3 THENπ      Ships% = Ships% + 1: GainShip = 4π      GOSUB Toon: GOTO OutCheckπ    END IFπ    IF Score% >= 500 AND GainShip = 4 THENπ      Ships% = Ships% + 1: GainShip = 5π      GOSUB Toon: GOTO OutCheckπ    END IFπ    GOTO OutCheckπToon:                                                      π  PLAY "mbo2l16ddeeffgg": RETURNπOutCheck:                                                  πEND SUBππSUB HelpScreenπHelpPart1:                                                 π  SCREEN 7, 0, 2, 0π  CLS : LOCATE 25, 1: COLOR 5π    PRINT "Press     to exit or     for next page."π  LOCATE 25, 7: COLOR 11: PRINT "ESC"π  LOCATE 1, 1: COLOR 12: PRINT "Instructions"π  LOCATE 1, 30: COLOR 15: PRINT "Page 1 of 3"π  LINE (0, 9)-(319, 9), 4π  LOCATE 3, 1: COLOR 15π  PRINT "Blast your way through twentyfive waves"π  LOCATE 4, 1: PRINT "of Vordoxian scum to save the earth!"π    PUT (10, 48), RShip%, PSETπ    PUT (15, 121), EFShip%, PSETπ  LOCATE 8, 24: COLOR 14: PRINT "The Red Baron"π  LOCATE 10, 1: COLOR 7π    PRINT "Your fighter.  Armed with the latest in"π    PRINT "laser technology, the Red Baron's dual"π    PRINT "laser cannons will cut through an enemy"π    PRINT "fighter craft like a chainsaw through"π    PRINT "a teenager!  Or so I've heard..."π  LOCATE 17, 20: COLOR 14: PRINT "Vordoxian Fighter"π  LOCATE 19, 1: COLOR 7π    PRINT "The most common type of space craft"π    PRINT "employed by the enemy.  These ships"π    PRINT "are armed with two laser cannons,"π    PRINT "although not nearly as powerful as"π    PRINT "the Red Baron's."π  LOCATE 23, 19: COLOR 3: PRINT "(5 points)"ππ  LINE (173, 188)-(183, 198), 4, Bπ  PAINT (174, 189), 12, 4: LINE (178, 190)-(178, 196), 0π  LINE (177, 195)-(179, 195), 0π  LINE (176, 194)-(180, 194), 0π  PSET (182, 189), 15π  SCREEN 7, 0, 0, 0: PCOPY 2, 0πUserInput2:                                                π   a$ = INKEY$π   IF a$ = CHR$(0) + CHR$(80) THEN GOTO HelpPart2π   IF a$ = CHR$(27) THEN GOTO HelpDoneπ   GOTO UserInput2πHelpPart2:                                                 π  SCREEN 7, 0, 2, 0π  CLS : LOCATE 25, 3: COLOR 5π    PRINT "Press     to exit or     or     ."π  LOCATE 25, 9: COLOR 11: PRINT "ESC"π  LOCATE 1, 1: COLOR 12: PRINT "Instructions"π  LOCATE 1, 30: COLOR 15: PRINT "Page 2 of 3"π  LINE (0, 9)-(319, 9), 4π  PUT (15, 13), EEShip%, PSETπ  LOCATE 3, 14: COLOR 14: PRINT "Vordoxian Elite Fighter"π  LOCATE 5, 1: COLOR 7π    PRINT "The pilots of these ships are a little"π    PRINT "more trigger happy than the norm."π    PRINT "Always joined by fellow Elite ships,"π    PRINT "they will often fire in sync."π  LOCATE 9, 1: COLOR 3: PRINT "(10 points)"π  LOCATE 12, 4: COLOR 9: PRINT "?"π  LOCATE 12, 13: COLOR 14: PRINT "Vordoxian Command Vessel"π  LOCATE 14, 1: COLOR 7π    PRINT "Chances are, the command ship leading"π    PRINT "the Vordoxian fighters is pretty"π    PRINT "powerful."π  LOCATE 16, 12: COLOR 3: PRINT "(50 points)"π  LINE (188, 188)-(198, 198), 4, Bπ  PAINT (189, 189), 12, 4: LINE (193, 190)-(193, 196), 0π  LINE (192, 191)-(194, 191), 0π  LINE (191, 192)-(195, 192), 0π  PSET (197, 189), 15π  LINE (248, 188)-(258, 198), 4, Bπ  PAINT (249, 189), 12, 4: LINE (253, 190)-(253, 196), 0π  LINE (252, 194)-(254, 194), 0π  LINE (251, 193)-(255, 193), 0π  PSET (257, 189), 15π  SCREEN 7, 0, 0, 0: PCOPY 2, 0πUserInput3:                                                π   a$ = INKEY$π   IF a$ = CHR$(0) + CHR$(80) THEN GOTO HelpPart3π   IF a$ = CHR$(0) + CHR$(72) THEN GOTO HelpPart1π   IF a$ = CHR$(27) THEN GOTO HelpDoneπ   GOTO UserInput3πHelpPart3:                                                 π  SCREEN 7, 0, 2, 0π  CLS : LOCATE 25, 1: COLOR 5π    PRINT "Press     to exit or     for prev page."ππ  LOCATE 25, 7: COLOR 11: PRINT "ESC"π  LOCATE 1, 1: COLOR 12: PRINT "Instructions"π  LOCATE 1, 30: COLOR 15: PRINT "Page 3 of 3"π  LINE (0, 9)-(319, 9), 4π  CALL Keypadπ  LOCATE 5, 10: COLOR 7π  PRINT "Although you can use the"π  LOCATE 6, 10: PRINT "separate arrow keys, it's"π  LOCATE 7, 10: PRINT "recommended that you use"π  LOCATE 8, 10: PRINT "the keypad, as this will"π  LOCATE 9, 10: PRINT "allow you to move in all"π  LOCATE 10, 10: PRINT "eight directions."π  LOCATE 15, 1: PRINT "Press the"π  LOCATE 15, 11: COLOR 15: PRINT "SPACE BAR"π  LOCATE 15, 21: COLOR 7: PRINT "to fire."π  COLOR 3π  LOCATE 11, 10: PRINT "(Number Lock must be off.)"π  LOCATE 17, 1: COLOR 7π  PRINT "For every 100 points, up to 500, you"π  PRINT "will receive an extra ship."π  LOCATE 20, 1: COLOR 7π  PRINT "If you wish to end the game while"π  PRINT "playing, just press `"π  LOCATE 21, 22: COLOR 15: PRINT "q"π  LOCATE 21, 23: COLOR 7: PRINT "' to quit."π  SCREEN 7, 0, 0, 0: PCOPY 2, 0π  LINE (173, 188)-(183, 198), 4, Bπ  PAINT (174, 189), 12, 4: LINE (178, 190)-(178, 196), 0π  LINE (177, 191)-(179, 191), 0π  LINE (176, 192)-(180, 192), 0π  PSET (182, 189), 15πUserInput4:                                                π   a$ = INKEY$π   IF a$ = CHR$(0) + CHR$(72) THEN GOTO HelpPart2π   IF a$ = CHR$(27) THEN GOTO HelpDoneπ   GOTO UserInput4πHelpDone:                                                  πEND SUBππSUB IntroπIntro1:                                                    π  SCREEN 7, 0, 2, 0π  CLS : CALL RedBaron: LOCATE 17, 1: COLOR 7π  PRINT "     The Red Baron.  That is what the"π  PRINT "media has called it.  The vigilante"π  PRINT "space craft has been known to appear"π  PRINT "in distant areas of space, aiding small"π  PRINT "colonies in defense from pirates and"π  PRINT "scavengers."π  SCREEN 7, 0, 0, 0: PCOPY 2, 0π   a$ = INKEY$π   IF a$ = CHR$(13) THEN GOTO Intro2π   GOTO Intro1πIntro2:                                                    π  SCREEN 7, 0, 2, 0ππ  CLS : CALL RedBaron: LOCATE 17, 1: COLOR 7π  PRINT "     No one knows who the pilot is."π  PRINT "A He?  She?  It?  The authorities have"π  PRINT "been desparate to catch the pilot."π  PRINT "Even more so now than before due to"π  PRINT "the recent events..."π  SCREEN 7, 0, 0, 0: PCOPY 2, 0π   a$ = INKEY$π   IF a$ = CHR$(13) THEN GOTO Intro3π   GOTO Intro2πIntro3:                                                    π  SCREEN 7, 0, 2, 0π  CLS : CALL RedBaron: LOCATE 17, 1: COLOR 7π  PRINT "     An alien race, known as the"π  PRINT "Vordoxians, has declared war on mankind."π  PRINT "Their first attack was swift and deadly."π  PRINT "Capturing a distant communications"π  PRINT "outpost, the Vordoxians released the"π  PRINT "most powerful computer virus ever known"π  PRINT "to man."π  SCREEN 7, 0, 0, 0: PCOPY 2, 0π   a$ = INKEY$π   IF a$ = CHR$(13) THEN GOTO Intro4π   GOTO Intro3πIntro4:                                                    π  SCREEN 7, 0, 2, 0π  CLS : CALL RedBaron: LOCATE 17, 1: COLOR 7π  PRINT "     The virus infected everything."π  PRINT "No matter how well secure the system,"π  PRINT "the computer virus was able to penetrate"π  PRINT "its defenses.  After only twentyfour"π  PRINT "hours, virtually everything electronic"π  PRINT "was rendered useless."π  SCREEN 7, 0, 0, 0: PCOPY 2, 0π   a$ = INKEY$π   IF a$ = CHR$(13) THEN GOTO Intro5π   GOTO Intro4πIntro5:                                                    π  SCREEN 7, 0, 2, 0π  CLS : CALL RedBaron: LOCATE 17, 1: COLOR 7π  PRINT "     Astronomers, using nothing more"π  PRINT "than simple telescopes, then discovered"π  PRINT "the second part in this evil attack."π  PRINT "Hordes of Vordoxian fighters had been"π  PRINT "sighted entering Earth's solar system!"π  PRINT "Without a solid defense after the virus"π  PRINT "the end of the Human race was eminent."π  SCREEN 7, 0, 0, 0: PCOPY 2, 0π   a$ = INKEY$π   IF a$ = CHR$(13) THEN GOTO Intro6π   GOTO Intro5πIntro6:                                                    π  SCREEN 7, 0, 2, 0π  CLS : CALL RedBaron: LOCATE 17, 1: COLOR 7π  PRINT "     Then miraculously, the Red Baron"ππ  PRINT "was sighted!  Somehow escaping the"π  PRINT "clutches of the Vordoxian computer"π  PRINT "virus, the red ship was seen heading"π  PRINT "on an intercept course for the enemy."π  PRINT "Now the Red Baron was the last hope"π  PRINT "for the Human race..."π  SCREEN 7, 0, 0, 0: PCOPY 2, 0π   a$ = INKEY$π   IF a$ = CHR$(13) THEN GOTO IntroDoneπ   GOTO Intro6πIntroDone:                                                 πEND SUBππSUB Keypadπ  LINE (10, 35)-(20, 45), 8, B: PAINT (11, 36), 7, 8π  LINE (22, 35)-(32, 45), 8, B: PAINT (23, 36), 7, 8π  LINE (34, 35)-(44, 45), 8, B: PAINT (35, 36), 7, 8π  LINE (46, 35)-(56, 45), 8, B: PAINT (47, 36), 7, 8π  LINE (46, 47)-(56, 69), 8, B: PAINT (47, 48), 7, 8π  LINE (46, 71)-(56, 93), 8, B: PAINT (47, 73), 7, 8π  LINE (10, 83)-(32, 93), 8, B: PAINT (11, 84), 7, 8π  LINE (34, 83)-(44, 93), 8, B: PAINT (35, 84), 7, 8π  LINE (10, 47)-(20, 57), 7, B: PAINT (11, 48), 15, 7π  LINE (22, 47)-(32, 57), 7, B: PAINT (23, 48), 15, 7π  LINE (34, 47)-(44, 57), 7, B: PAINT (35, 48), 15, 7π  LINE (10, 59)-(20, 69), 7, B: PAINT (11, 60), 15, 7π  LINE (22, 59)-(32, 69), 7, B: PAINT (23, 60), 15, 7π  LINE (34, 59)-(44, 69), 7, B: PAINT (35, 60), 15, 7π  LINE (10, 71)-(20, 81), 7, B: PAINT (11, 72), 15, 7π  LINE (22, 71)-(32, 81), 7, B: PAINT (23, 72), 15, 7π  LINE (34, 71)-(44, 81), 7, B: PAINT (35, 72), 15, 7π  LINE (13, 50)-(17, 54), 0π  LINE (13, 51)-(14, 50), 0: LINE (13, 52)-(15, 50), 0π  LINE (27, 50)-(27, 54), 0π  LINE (26, 51)-(28, 51), 0: LINE (25, 52)-(29, 52), 0π  LINE (37, 54)-(41, 50), 0π  LINE (40, 50)-(41, 51), 0: LINE (39, 50)-(41, 52), 0π  LINE (13, 64)-(17, 64), 0π  LINE (14, 63)-(14, 65), 0: LINE (15, 62)-(15, 66), 0π  LINE (37, 64)-(41, 64), 0π  LINE (40, 63)-(40, 65), 0: LINE (39, 62)-(39, 66), 0π  LINE (13, 78)-(17, 74), 0π  LINE (13, 77)-(14, 78), 0: LINE (13, 76)-(15, 78), 0π  LINE (27, 74)-(27, 78), 0π  LINE (26, 77)-(28, 77), 0: LINE (25, 76)-(29, 76), 0π  LINE (37, 74)-(41, 78), 0π  LINE (40, 78)-(41, 77), 0: LINE (39, 78)-(41, 76), 0πEND SUBππSUB MainScreen (HScore%, ASCII%)πStart:                                                     π  SCREEN 7, 0, 2, 0π  CLS : CALL Titleπ  LOCATE 12, 16: COLOR 9: PRINT "High Score:"π  LOCATE 13, 15: COLOR 11: PRINT HScore%ππ  LINE (99, 120)-(220, 183), 4, Bπ  LINE (100, 121)-(219, 182), 12, Bπ  LINE (101, 122)-(218, 181), 4, Bπ  COLOR 11: LOCATE 17, 18: PRINT "Select:"π  C1 = 15: C2 = 4: C3 = 4: C4 = 4π  highlight = 1π  SCREEN 7, 0, 0, 0: PCOPY 2, 0πDisplayText1:                                              π  COLOR C1: LOCATE 19, 15: PRINT "Introduction"π  COLOR C2: LOCATE 20, 16: PRINT "Play Game"π  COLOR C3: LOCATE 21, 19: PRINT "Help"π  COLOR C4: LOCATE 22, 19: PRINT "Quit"π                                                            πUserInput1:                                                π   a$ = INKEY$π   IF a$ = CHR$(0) + CHR$(72) THENπ      highlight = highlight - 1: GOTO HightOfMyLight1π   END IFπ   IF a$ = CHR$(0) + CHR$(80) THENπ      highlight = highlight + 1: GOTO HightOfMyLight1π   END IFπ   IF a$ = CHR$(13) THEN GOTO DetermineSelection1π   IF a$ = "a" OR a$ = "A" THEN ASCII% = 1π   GOTO UserInput1π                                                            πHightOfMyLight1:                                           π   IF highlight > 4 THEN highlight = 1π   IF highlight < 1 THEN highlight = 4π   IF highlight = 1 THEN C1 = 15: C2 = 4: C3 = 4: C4 = 4π   IF highlight = 2 THEN C2 = 15: C1 = 4: C3 = 4: C4 = 4π   IF highlight = 3 THEN C3 = 15: C1 = 4: C2 = 4: C4 = 4π   IF highlight = 4 THEN C4 = 15: C1 = 4: C2 = 4: C3 = 4π   GOTO DisplayText1π                                                            πDetermineSelection1:                                       π  IF highlight = 1 THEN CALL Intro: GOTO Startπ  IF highlight = 2 THEN GOTO Done1π  IF highlight = 3 THEN CALL HelpScreen: GOTO Startπ  IF highlight = 4 THEN CLS : SYSTEMπ  GOTO DisplayText1πDone1:                                                     πEND SUBππSUB MoveDown (Y%)π  Y% = Y% + 5π  IF Y% > 170 THEN Y% = 170πEND SUBππSUB MoveLeft (X%)π  X% = X% - 5π  IF X% < 20 THEN X% = 20πEND SUBππSUB MoveRight (X%)π  X% = X% + 5ππ  IF X% > 250 THEN X% = 250πEND SUBππSUB MoveUp (Y%)π  Y% = Y% - 5π  IF Y% < 100 THEN Y% = 100πEND SUBππSUB PrivateASCIIπ  CLS : LOCATE 1, 3: COLOR 12: PRINT "O"π  LOCATE 2, 2: PRINT "/"π  LOCATE 2, 3: COLOR 10: PRINT "|"π  LOCATE 2, 4: COLOR 12: PRINT "\"π  LOCATE 3, 2: COLOR 9: PRINT "/ \"π  GET (8, 0)-(30, 22), ASCII%π  CLSπEND SUBππSUB RedBaronπ  RDirect = INT(RND * 4) + 1π  IF RDirect = 1 THEN ry = -5π  IF RDirect = 2 THEN rx = 5π  IF RDirect = 3 THEN ry = 5π  IF RDirect = 4 THEN rx = -5π  CIRCLE (125 + rx, 80 + ry), 11, 4π  PAINT (130 + rx, 85 + ry), 4, 4π  CIRCLE (125 + rx, 80 + ry), 8, 0π  CIRCLE (125 + rx, 80 + ry), 2, 0π  PAINT (125 + rx, 80 + ry), 0, 0π  LINE (90 + rx, 60 + ry)-(115 + rx, 85 + ry), 4π  LINE (100 + rx, 50 + ry)-(135 + rx, 75 + ry), 4π  LINE (100 + rx, 50 + ry)-(97 + rx, 49 + ry), 4π  LINE (97 + rx, 49 + ry)-(90 + rx, 50 + ry), 4π  LINE (89 + rx, 51 + ry)-(88 + rx, 52 + ry), 4π  LINE (88 + rx, 52 + ry)-(88 + rx, 56 + ry), 4π  LINE (88 + rx, 57 + ry)-(89 + rx, 59 + ry), 4π  PAINT (92 + rx, 60 + ry), 12, 4π  LINE (95 + rx, 50 + ry)-(122 + rx, 70 + ry), 15π  CIRCLE (225 + rx, 80 + ry), 11, 4π  PAINT (230 + rx, 85 + ry), 4, 4π  CIRCLE (225 + rx, 80 + ry), 8, 0π  CIRCLE (225 + rx, 80 + ry), 2, 0π  PAINT (225 + rx, 80 + ry), 0, 0π  LINE (180 + rx, 60 + ry)-(215 + rx, 85 + ry), 4π  LINE (190 + rx, 50 + ry)-(234 + rx, 74 + ry), 4π  LINE (190 + rx, 50 + ry)-(187 + rx, 49 + ry), 4π  LINE (187 + rx, 49 + ry)-(180 + rx, 50 + ry), 4π  LINE (179 + rx, 51 + ry)-(178 + rx, 52 + ry), 4π  LINE (178 + rx, 52 + ry)-(178 + rx, 56 + ry), 4π  LINE (178 + rx, 57 + ry)-(179 + rx, 59 + ry), 4π  PAINT (192 + rx, 60 + ry), 12, 4π  LINE (185 + rx, 50 + ry)-(221 + rx, 70 + ry), 15π  LINE (118 + rx, 55 + ry)-(165 + rx, 55 + ry), 4π  LINE (118 + rx, 55 + ry)-(113 + rx, 58 + ry), 4π  LINE (166 + rx, 55 + ry)-(184 + rx, 58 + ry), 4ππ  LINE (185 + rx, 59 + ry)-(205 + rx, 71 + ry), 4π  LINE (205 + rx, 71 + ry)-(185 + rx, 71 + ry), 4π  LINE (192 + rx, 71 + ry)-(205 + rx, 75 + ry), 4, BFπ  LINE (130 + rx, 71 + ry)-(145 + rx, 71 + ry), 4π  LINE (135 + rx, 75 + ry)-(145 + rx, 75 + ry), 4π  LINE (145 + rx, 71 + ry)-(145 + rx, 75 + ry), 4π  LINE (145 + rx, 71 + ry)-(180 + rx, 96 + ry), 4π  LINE (155 + rx, 82 + ry)-(180 + rx, 100 + ry), 4π  LINE (140 + rx, 75 + ry)-(150 + rx, 82 + ry), 4π  LINE (150 + rx, 82 + ry)-(155 + rx, 82 + ry), 4π  LINE (147 + rx, 74 + ry)-(147 + rx, 76 + ry), 4π  LINE (147 + rx, 76 + ry)-(145 + rx, 78 + ry), 4π  LINE (185 + rx, 71 + ry)-(220 + rx, 96 + ry), 4π  PAINT (190 + rx, 72 + ry), 4, 4π  LINE (180 + rx, 96 + ry)-(191 + rx, 102 + ry), 4π  LINE (180 + rx, 100 + ry)-(190 + rx, 103 + ry), 4π  LINE (220 + rx, 96 + ry)-(221 + rx, 100 + ry), 4π  LINE (220 + rx, 101 + ry)-(215 + rx, 103 + ry), 4π  LINE (214 + rx, 103 + ry)-(205 + rx, 104 + ry), 4π  LINE (204 + rx, 104 + ry)-(195 + rx, 103 + ry), 4π  LINE (195 + rx, 103 + ry)-(189 + rx, 103 + ry), 4π  PAINT (170 + rx, 90 + ry), 4, 4π  PAINT (188 + rx, 102 + ry), 4, 4π  PAINT (180 + rx, 70 + ry), 12, 4π  PAINT (140 + rx, 72 + ry), 4, 4π  LINE (179 + rx, 59 + ry)-(194 + rx, 70 + ry), 12π  PSET (120 + rx, 62 + ry), 4: PSET (125 + rx, 65 + ry), 4π  PSET (179 + rx, 100 + ry), 0π  PSET (181 + rx, 101 + ry), 0π  LINE (184 + rx, 90 + ry)-(205 + rx, 90 + ry), 0π  LINE (184 + rx, 90 + ry)-(190 + rx, 95 + ry), 0π  LINE (191 + rx, 95 + ry)-(197 + rx, 96 + ry), 0π  LINE (205 + rx, 90 + ry)-(210 + rx, 93 + ry), 0π  LINE (211 + rx, 94 + ry)-(207 + rx, 96 + ry), 0π  LINE (207 + rx, 96 + ry)-(198 + rx, 96 + ry), 0π  PAINT (200 + rx, 91 + ry), 14, 0π  CIRCLE (193 + rx, 93 + ry), 1, 15π  LINE (191 + rx, 93 + ry)-(195 + rx, 93 + ry), 15π  LINE (200 + rx, 95 + ry)-(206 + rx, 95 + ry), 6π  LINE (207 + rx, 94 + ry)-(208 + rx, 94 + ry), 6π  PSET (194 + rx, 95 + ry), 6π  PSET (205 + rx, 91 + ry), 6π  LINE (207 + rx, 92 + ry)-(208 + rx, 93 + ry), 6π  LINE (70 + rx, 73 + ry)-(106 + rx, 73 + ry), 4π  LINE (106 + rx, 73 + ry)-(98 + rx, 65 + ry), 4π  LINE (102 + rx, 72 + ry)-(96 + rx, 66 + ry), 12π  LINE (70 + rx, 73 + ry)-(98 + rx, 65 + ry), 4π  PAINT (75 + rx, 72 + ry), 12, 4π  LINE (234 + rx, 73 + ry)-(245 + rx, 73 + ry), 4π  LINE (245 + rx, 73 + ry)-(220 + rx, 66 + ry), 4π  PAINT (238 + rx, 72 + ry), 12, 4π  PSET (224 + rx, 68 + ry), 12π  PSET (114 + rx, 83 + ry), 12π  LINE (160 + rx, 75 + ry)-(175 + rx, 85 + ry), 4π  LINE (183 + rx, 75 + ry)-(198 + rx, 85 + ry), 4ππ  LINE (150 + rx, 59 + ry)-(145 + rx, 64 + ry), 15π  LINE (146 + rx, 65 + ry)-(168 + rx, 70 + ry), 4π  LINE (151 + rx, 59 + ry)-(168 + rx, 62 + ry), 4π  LINE (168 + rx, 63 + ry)-(169 + rx, 70 + ry), 4π  LINE (129 + rx, 71 + ry)-(130 + rx, 71 + ry), 0π  LINE (131 + rx, 72 + ry)-(132 + rx, 72 + ry), 0π  LINE (132 + rx, 72 + ry)-(135 + rx, 75 + ry), 0π  LDirect = INT(RND * 5) + 1π  IF LDirect = 1 THENπ    LINE (125 + rx, 80 + ry)-(165 + rx, 110 + ry), 1π    LINE (225 + rx, 80 + ry)-(275 + rx, 110 + ry), 1π  END IFπ  PSET (10, 40), 9: PSET (280, 50), 9π  PSET (40, 90), 9: PSET (110, 35), 1π  PSET (30, 100), 1: PSET (150, 90), 9π  PSET (250, 70), 9: PSET (100, 100), 1π  PSET (200, 45), 9: PSET (290, 105), 1πEND SUBππSUB RedShipπ  CLSπ  LINE (140, 150)-(144, 160), 4, Bπ  PAINT (141, 151), 12, 4π  LINE (142, 150)-(142, 160), 12π  LINE (142, 151)-(142, 159), 15π  PSET (140, 160), 0: PSET (144, 160), 0π  LINE (145, 158)-(148, 160), 4π  LINE (149, 160)-(156, 160), 4π  LINE (159, 158)-(157, 160), 4π  LINE (145, 153)-(148, 153), 4π  LINE (159, 153)-(156, 153), 4π  LINE (148, 153)-(148, 145), 4π  LINE (156, 153)-(156, 145), 4π  LINE (149, 144)-(153, 143), 4π  LINE (154, 143)-(156, 145), 4π  LINE (160, 150)-(164, 160), 4, Bπ  PAINT (150, 150), 12, 4π  LINE (151, 154)-(149, 156), 4π  LINE (149, 156)-(151, 158), 4π  LINE (153, 154)-(155, 156), 15π  LINE (153, 158)-(154, 157), 15π  PSET (152, 154), 4: PSET (152, 158), 15π  LINE (150, 147)-(154, 147), 0π  PSET (150, 146), 0: PSET (154, 146), 0π  LINE (151, 145)-(153, 145), 0π  LINE (151, 146)-(153, 146), 6π  PSET (152, 146), 14: PSET (153, 146), 15π  PAINT (161, 151), 12, 4π  LINE (162, 150)-(162, 160), 12π  LINE (162, 151)-(162, 159), 15π  PSET (160, 160), 0: PSET (164, 160), 0π  LINE (135, 153)-(139, 153), 4π  LINE (135, 153)-(139, 155), 4π  LINE (165, 153)-(169, 153), 4π  LINE (165, 155)-(166, 155), 4ππ  LINE (167, 154)-(168, 154), 4π  LINE (138, 154)-(139, 154), 12π  LINE (165, 154)-(166, 154), 12π  LINE (150, 149)-(150, 152), 4π  LINE (154, 149)-(154, 152), 4π  GET (135, 143)-(169, 160), RShip%πEND SUBππSUB RedShipMaskπ  CLSπ  LINE (140, 143)-(149, 143), 15π  LINE (155, 143)-(164, 143), 15π  LINE (140, 144)-(148, 144), 15π  LINE (156, 144)-(164, 144), 15π  LINE (140, 145)-(147, 149), 15, BFπ  LINE (135, 143)-(139, 152), 15, BFπ  LINE (165, 143)-(169, 152), 15, BFπ  LINE (145, 150)-(147, 150), 15π  LINE (145, 151)-(147, 151), 15π  LINE (145, 152)-(147, 152), 15π  LINE (157, 145)-(164, 149), 15, BFπ  LINE (157, 150)-(159, 150), 15π  LINE (157, 151)-(159, 151), 15π  LINE (157, 152)-(159, 152), 15π  PSET (145, 159), 15π  LINE (144, 160)-(146, 160), 15π  PSET (159, 159), 15π  LINE (158, 160)-(160, 160), 15π  LINE (135, 156)-(139, 160), 15, BFπ  LINE (165, 156)-(169, 160), 15, BFπ  PSET (140, 160), 15: PSET (164, 160), 15π  LINE (135, 155)-(137, 155), 15π  LINE (167, 155)-(169, 155), 15π  PSET (135, 154), 15: PSET (169, 154), 15π  GET (135, 143)-(169, 160), RShipMask%πEND SUBππSUB starsπ    FOR I = 1 TO 20π      IF ST(I) = 1 THEN C = 1 ELSE C = 9π      PSET (SX(I), SY(I)), Cπ      SY(I) = SY(I) + ST(I) + 1π      IF SY(I) > 199 THENπ        SY(I) = 0: SY(I) = FNR(1)π        ST(I) = FNR(2)π      END IFπ    NEXTπEND SUBππSUB Statistics (Score%, Ships%)π  LINE (7, 0)-(13, 7), 7, BF: LINE (13, 1)-(13, 7), 15π  LINE (7, 0)-(12, 0), 8: LINE (7, 1)-(7, 6), 8π  LINE (8, 7)-(13, 7), 15: LINE (304, 0)-(310, 7), 7, BFπ  LINE (310, 1)-(310, 7), 15: LINE (304, 0)-(309, 0), 8π  LINE (304, 0)-(304, 6), 8: LINE (305, 7)-(310, 7), 15ππ  LINE (106, 0)-(215, 7), 7, BF: LINE (106, 0)-(106, 6), 8π  LINE (106, 0)-(214, 0), 8: LINE (215, 1)-(215, 7), 15π  LINE (107, 7)-(214, 7), 15π  LOCATE 1, 3: COLOR 4: PRINT "Score:"π  LOCATE 1, 9: COLOR 11: PRINT Score%π  LOCATE 1, 29: COLOR 10: PRINT "Ships:"π  LOCATE 1, 35: COLOR 11: PRINT Ships%πEND SUBππSUB Sunset (rxpos, rypos)π  LINE (19, 40)-(300, 55), 4, BFπ  LINE (19, 55)-(300, 70), 12, BFπ  LINE (19, 70)-(300, 90), 14, BFπ  LINE (19, 30)-(300, 30), 4π  LINE (19, 38)-(300, 38), 4: LINE (19, 35)-(300, 35), 4π  LINE (19, 45)-(300, 45), 12π  LINE (19, 50)-(300, 50), 12: LINE (19, 53)-(300, 53), 12π  LINE (19, 60)-(300, 60), 14π  LINE (19, 68)-(300, 68), 14: LINE (19, 65)-(300, 65), 14π  CIRCLE (155, 90), 20, 15π  PAINT (155, 90), 15, 15π  LINE (0, 91)-(319, 110), 0, BFπ  LINE (19, 55)-(25, 60), 0: LINE (25, 60)-(35, 65), 0π  LINE (35, 65)-(44, 80), 0: LINE (44, 80)-(60, 90), 0π  PAINT (21, 60), 0, 0π  LINE (250, 90)-(270, 80), 0: LINE (270, 80)-(275, 75), 0π  LINE (276, 75)-(290, 90), 0: PAINT (260, 88), 0, 0π  PSET (100, 20), 1: PSET (250, 25), 8: PSET (50, 28), 8π  PSET (70, 36), 1: PSET (200, 33), 1: PSET (210, 10), 1π  PSET (20, 20), 9: PSET (55, 10), 9: PSET (170, 15), 9π  PSET (150, 13), 9: PSET (149, 13), 1: PSET (151, 13), 1π  PSET (150, 12), 1: PSET (150, 14), 1: PSET (280, 20), 1π  IF rxpos < 1 THEN rxpos = 300: rypos = 80π  rxpos = rxpos - 5: rypos = rypos - 1π  LINE (rxpos, rypos)-(rxpos + 3, rypos), 0, BF'ship       πSunsetDone:                                                πEND SUBππSUB Titleπ  'r                                                       π  LINE (35, 10)-(75, 10), 4: LINE (35, 10)-(40, 15), 4π  LINE (40, 15)-(40, 30), 4: LINE (40, 30)-(35, 35), 4π  LINE (35, 35)-(55, 35), 4: LINE (55, 35)-(50, 30), 4π  LINE (50, 30)-(50, 15), 4: LINE (50, 15)-(65, 15), 4π  LINE (65, 15)-(85, 35), 4: LINE (75, 10)-(85, 20), 4π  LINE (55, 20)-(85, 20), 4: LINE (55, 20)-(65, 30), 4π  LINE (65, 30)-(60, 35), 4: LINE (60, 35)-(85, 35), 4π  'e                                                       π  LINE (85, 10)-(90, 15), 4: LINE (85, 10)-(135, 10), 4π  LINE (135, 10)-(130, 15), 4: LINE (130, 15)-(100, 15), 4π  LINE (90, 15)-(90, 30), 4: LINE (90, 30)-(85, 35), 4π  LINE (85, 35)-(135, 35), 4: LINE (135, 35)-(130, 30), 4π  LINE (130, 30)-(100, 30), 4: LINE (100, 15)-(100, 20), 4π  LINE (100, 30)-(100, 25), 4: LINE (100, 20)-(120, 20), 4π  LINE (100, 25)-(120, 25), 4: LINE (120, 20)-(120, 25), 4ππ  'd                                                       π  LINE (135, 10)-(175, 10), 4: LINE (135, 10)-(140, 15), 4π  LINE (140, 15)-(140, 30), 4: LINE (140, 30)-(135, 35), 4π  LINE (135, 35)-(175, 35), 4: LINE (150, 15)-(150, 30), 4π  LINE (150, 15)-(170, 15), 4: LINE (150, 30)-(170, 30), 4π  LINE (175, 10)-(185, 20), 4: LINE (175, 35)-(185, 25), 4π  LINE (185, 20)-(185, 25), 4: LINE (170, 15)-(175, 20), 4π  LINE (170, 30)-(175, 25), 4: LINE (175, 20)-(175, 25), 4π  'b                                                       π  LINE (35, 40)-(75, 40), 4: LINE (35, 40)-(40, 45), 4π  LINE (40, 45)-(40, 60), 4: LINE (40, 60)-(35, 65), 4π  LINE (35, 65)-(75, 65), 4: LINE (75, 40)-(85, 50), 4π  LINE (75, 65)-(85, 55), 4: LINE (85, 50)-(83, 52), 4π  LINE (85, 55)-(83, 53), 4: LINE (50, 45)-(70, 45), 4π  LINE (70, 45)-(75, 50), 4: LINE (75, 50)-(50, 50), 4π  LINE (50, 45)-(50, 50), 4: LINE (50, 60)-(70, 60), 4π  LINE (70, 60)-(75, 55), 4: LINE (75, 55)-(50, 55), 4π  LINE (50, 55)-(50, 60), 4π  'a                                                       π  LINE (110, 40)-(85, 65), 4: LINE (110, 40)-(135, 65), 4π  LINE (85, 65)-(105, 65), 4: LINE (105, 65)-(100, 60), 4π  LINE (100, 60)-(105, 55), 4: LINE (105, 55)-(115, 55), 4π  LINE (135, 65)-(115, 65), 4: LINE (115, 65)-(120, 60), 4π  LINE (120, 60)-(115, 55), 4π  'r                                                       π  LINE (135, 40)-(175, 40), 4: LINE (135, 40)-(140, 45), 4π  LINE (140, 45)-(140, 60), 4: LINE (140, 60)-(135, 65), 4π  LINE (135, 65)-(155, 65), 4: LINE (155, 65)-(150, 60), 4π  LINE (150, 60)-(150, 45), 4: LINE (150, 45)-(165, 45), 4π  LINE (165, 45)-(185, 65), 4: LINE (175, 40)-(185, 50), 4π  LINE (155, 50)-(185, 50), 4: LINE (155, 50)-(165, 60), 4π  LINE (165, 60)-(160, 65), 4: LINE (160, 65)-(185, 65), 4π  'o                                                       π  LINE (195, 40)-(225, 40), 4: LINE (195, 40)-(190, 45), 4π  LINE (225, 40)-(230, 45), 4: LINE (190, 45)-(190, 60), 4π  LINE (230, 45)-(230, 60), 4: LINE (190, 60)-(195, 65), 4π  LINE (230, 60)-(225, 65), 4: LINE (195, 65)-(225, 65), 4π  LINE (200, 45)-(220, 60), 4, Bπ  'n                                                       π  LINE (235, 40)-(240, 45), 4: LINE (240, 45)-(240, 60), 4π  LINE (240, 60)-(235, 65), 4: LINE (235, 40)-(250, 40), 4π  LINE (250, 40)-(265, 55), 4: LINE (235, 65)-(255, 65), 4π  LINE (255, 65)-(250, 60), 4: LINE (250, 60)-(250, 50), 4π  LINE (250, 50)-(265, 65), 4: LINE (265, 55)-(265, 40), 4π  LINE (265, 40)-(280, 40), 4: LINE (280, 40)-(275, 45), 4π  LINE (275, 45)-(275, 65), 4: LINE (275, 65)-(265, 65), 4π  PAINT (37, 11), 12, 4: PAINT (62, 34), 12, 4π  PAINT (87, 11), 12, 4: PAINT (137, 11), 12, 4π  PAINT (37, 41), 12, 4: PAINT (110, 41), 12, 4π  PAINT (137, 41), 12, 4: PAINT (162, 64), 12, 4π  PAINT (195, 41), 12, 4: PAINT (237, 41), 12, 4π  LINE (216, 25)-(245, 25), 12π  LOCATE 3, 28: COLOR 4: PRINT "2573"πEND SUBππSUB UpLeft (X%, Y%)π  X% = X% - 5: Y% = Y% - 5π  IF X% < 20 THEN X% = 20π  IF Y% < 100 THEN Y% = 100πEND SUBππSUB UpRight (X%, Y%)π  X% = X% + 5: Y% = Y% - 5π  IF X% > 250 THEN X% = 250π  IF Y% < 100 THEN Y% = 100πEND SUBππSUB WaveInfo (Wave, NumberofShips, Score%, Ships%)π    IF Wave = 0 THEN NumberofShips = 5π    IF Wave = 1 THEN NumberofShips = 1π    IF Wave = 2 THEN NumberofShips = 2π    IF Wave = 3 THEN NumberofShips = 2π    IF Wave = 4 THEN NumberofShips = 3π    IF Wave = 5 THEN NumberofShips = 3π    IF Wave = 6 THEN NumberofShips = 3π    IF Wave = 7 THEN NumberofShips = 4π    IF Wave = 8 THEN NumberofShips = 4π    IF Wave = 9 THEN NumberofShips = 4π    IF Wave = 10 THEN NumberofShips = 4π    IF Wave = 11 THEN NumberofShips = 5π    IF Wave = 12 THEN NumberofShips = 5π    IF Wave = 13 THEN NumberofShips = 5π    IF Wave = 14 THEN NumberofShips = 5π    IF Wave = 15 THEN NumberofShips = 2π    IF Wave = 16 THEN NumberofShips = 5π    IF Wave = 17 THEN NumberofShips = 3π    IF Wave = 18 THEN NumberofShips = 4π    IF Wave = 19 THEN NumberofShips = 5π    IF Wave = 20 THEN NumberofShips = 5π    IF Wave = 21 THEN NumberofShips = 5π    IF Wave = 22 THEN NumberofShips = 5π    IF Wave = 23 THEN NumberofShips = 5π    IF Wave = 24 THEN NumberofShips = 5π    IF Wave = 25 THEN NumberofShips = 1π    FOR times = 1 TO 50π      SCREEN 7, 0, 2, 0: PCOPY 1, 2π      CALL starsπ      LOCATE 13, 18: COLOR 12: PRINT "Wave"; Waveπ        IF Wave = 0 THENπ          LOCATE 14, 12: COLOR 15π          PRINT "ASCIIs in Space!!!"π        END IFπ      CALL Statistics(Score%, Ships%)π      SCREEN 7, 0, 0, 0: PCOPY 2, 0: PCOPY 1, 2π    NEXTπEND SUBππSUB YouLose (Score%, Ships%)π  FOR times = 1 TO 50π    SCREEN 7, 0, 2, 0: PCOPY 1, 2ππ    CALL stars: CALL Statistics(Score%, Ships%)π    LOCATE 13, 17: COLOR 12: PRINT "Game Over"π    SCREEN 7, 0, 0, 0: PCOPY 2, 0: PCOPY 1, 2π  NEXTπEND SUBππEric Blanding                  GAME MAPPING TECHNIQUE         FidoNet QUIK_BAS Echo          07-04-94 (00:00)       QB, QBasic, PDS        451  29726    MAPPING.BAS DEFINT A-Z:DIM SHARED K,S,B&,Z&:V1 'Created by PostIt! 7.2πSUB V1:OPEN "O",1,"MAPPING.ZIP",4^6:Z&=22040:?STRING$(50,177);πU"%up()%9%%%I-%3n]]AY(80]N27%%[H%%%/%%%%wj%firj.Sy'yW6)x>oT]+xWVOπU"xV^nPh[GRf[.W/JF0XvQ*jqG$=2p]<Sp-iiep-->0j]cmO'Zg(8hbp]TR0g[(9(πU"LorQ>b<rc\n>+/Pnj&$L<)Q,o9l(EI7)+XVqoX5Ad4WVY/jFRo=Tg]9P%$Gbff;πU"uNjB?3Ow1d^0CP:_$X*c%ZY?RTcmW_qcU47_Kt,[lLo/wT(n$za6ZpEE*Zt8^#IπU"[Tc/eN'(W8e3Q\bSA7VJFKvW&Nv$iHUb4(qHa]DdOdd_P_n1+N$?^4DR+MELTzuπU"/a1ANV[VCe)_Z/w%0P:WIu&S>?0ano-r%4UOfg$DKZD_eF-5(\=L5=rS5dYE1WcπU"xEN0x)wmi)M8mL8[R=Cf/eLBG+$hQbxk3:xH>1In6p$U.F8]?p8ir-Po/SZ#0SDπU"W*1=snT&:71K,SU8j=b2\T4N\kUf[RNOe:72PdC;/p>/=4oAa6c8a3#a$<m77r0πU"vBNoZje'.RDXpSv7\lLD6PinUR?R]e9cw:d4*i^wJ=4nh\qr(0V(GUc24lL(Dj3πU"gXSQnm=Z6[rLIVPaRM984$JLWUUw?W<X$KenFRHZ^=uODY;InL\77kj.*6Sv4&JπU"rLPTj5vB;Wi6UZBie=ItbtV_e?i/:>n<$c9S/]vGF,PDVtb:nvrYEusr_Esr_9?πU"2,EbV$IEJ=BF6Yg11M&RjjHBn^[Rd4'=aS#dQ+V88wT8:]fXDp-*Fd8cHHvg)o4πU",8ecDObgzkNDC\3?6w6/$I3/d/8.G,L[y6*OPh>24*UyH^KuIFF05?RY'Zk;wo]πU"QTo6.M[b_=Ikz8CxZp3EvqZ$Cv<xDsUkE;bx_=7.&]:Knb\Sf3Q?H=PT;nSwpLDπU"5p#sm8^?nJU,GIzUvwmFF/BjR%MiKvcveQ0(^MjGBJi.f^ea0?Pmfsw*DDhgRHvπU"tNL_mV;KnVESJ'XIUUf30bI2hjpKZ/7PWHoOywcS'vU>rQ(#Fva9?4xId9mRuq$πU"<PEqzoMMU#a(<X=Vs6'?#>H8h[8Ibl1,#SnUa&-Rr<1+T,oNRTJ4>?f:LK^ppPEπU"0D?As\0LJ?]uDNfEkrZHB4F#mWAG?%X]u0mst.LU.38Bd/h6Ln+=,h0ZkZirg7)πU"P;RR\\nVBqTWB#hvhn^^w,'d\g/h4]]Zw?,uZno],ZhqVj60Xpz\:f_]HeE_RAkπU"D=ARNI*p;DCQ$%c^_FgN>qpTFN;kbs;EKTMvM\DJ&g8GG.x'n.v3_0K&BP5+cx-πU"dRM/T]&qa?>)l(wGI'X,>y+2Yp&Nl^;A(8k$4rgl-;RlniXE0bIyF#$U17CE/zSπU"00#NZQkG3/w6F0A.Dq74]WJ^2[>b9.sME^+.B_^Ud1?4c5k^2NkDc<ES;;yMrHpπU"htZ]b*$u:.JL+/)ABmz/Sxc_p[+KGf-qqw6T&WL*aLw_>VCO:Z1K9k4/(Sg^_>rπU"%HRCa)ovmbG6af>t]JGtYp=)vTpL=,2OM.5g.jc0i4Sd2gE4doptL%7-&o1)%89πU"n:.9,Ir;cG_ACV[&_c-#BTjavqS6#noD;<W=&\Gukv9_*_p*&Z:sb/YE:Ctcm8DπU"%[E$;6>E;61tb.0N[d(W>82_WDfxOB]M:Sk([fFHP%.I_Y?PlhnA&n$cS&ARgr_πU"Rn46v<m[_U:bK0sXxM,hw[C2Fv&2[L?jeUg&=e&f7JM6S8WZ;7X?>%=Ql7FTe/=πU"ZZ3t[fY>?0Q%-+%M03OiT=#>::+]O.nU>7gxl$;Ap2(tPT%U0&-Gxy$Z_D6LkbwπU"Wc3]vZ(KpI/ARQBENY&*6NG1bodFm$L/HtlA#Z,ll^-XnA%:7JnI=5?I.NrYDE8πU"<i3AL;)yAxYW4X,A&bL$INID/f)n&O<OjFZ\;KpxJhr;=_nHUI<0c1nChomtv1dπU"kA:)ff4Ug:Zvqka>MO:O;h1gJLj&\?\FXsh;fJ?8DXbM#M)Z(B9d\sf.jTS$rvTπU"J_*ryW+M=SJO:0xnNRWMZR&bcH6W8_rI(bIFnUxLq1*DLl>:?cjWFF4corUzEg]πU"tBIn+lHd.H&rE+OEf39)hPtW&ca_QYdC$apgR?wKKpv;Kbftw%k:Oys(cUhUbfIπU"7^_Rlb\1SY3lc<(&Ll4wv($1DE-fE)Z7QMg1_(5.G>TOKz$d9$DUu&e(a,1Y*EAπU"_N4TSf,pZw9A,,oql4IJR<&AkKu4sw]hZ*KY9J#Syg#*n+o,3<zj3(,wRBRft-PπU"RYW('$$BRi$,GS*T2g4(%Rn^WB$--h9%E1OhuSCrP;?gn2TAA4TgLPr-bvxhFaTπU">EpREUXD\$?td=#3ed5g5j2B'(SV<rB[t/d]sr\G-B;jccMW4q>JNf%;;#xoV4/πU"$[6vM8)X9_\1]LIohY'[MIiXgl3]#exEBXY=f9amgx?Bi1B,$lVQJPL/DAX%AmlπU"L/bdXI1U]ps5pVqW09,_a\kP]Lpi;5+r]qu/JZ[zx'XtSTLHa])UfD)Z$.**'%4πU"1zzW7jqEf+1:)#NRZdnc5:LKmmHuG#:$%1&8jx/Oe(o\i8ro[DJuw:hrDY=Wh[gπU"ao82TBvs8R=DIK4(:+NdImD#.3b1VZeC/^7.oS;v8we*mI&lCEu8b[R>BjeMk+0πU"CW8R8l^Ma-&D26&hRi6KMsn:C]pciF#1B0[J3=1,ILi6^TXk8uml/kpV_C4S&=(πU"WtjO)D$N6O8GZt8sAEfTb9N9LyEi%%)S-$$6g?])troi/3R)VDrqGoZIo>1QKAXπU"EsXQB&^4shKU<o-)_&NkK%u_hxdVk2A9%1G;A%P'*^Trk'Ye#K5a0o2rewY+2NwπU"Z,2)weUQqbVaM*v0Dk:#_iw;16O:_J?Px#zO/b+t$(]lsb<kk1r5/CiL2xCwo^vπU"d*jzI.T<]ooftv(>cD-E#wy54lC25YG[NN+JWyiA3*OB#l*mhNe)SFS?T&Y;NY<πU"qS2uerM=uA$<HQ_vUCu)o<AL)X:_3$.p219c$gfsc^:=zS-_.txs0>&3<Y_MK:EπU"._ZW\'MHw5S#vW#vN<l&t1U<KB(tM[?zv=<8cSP['5os;&cqN/o#8.Q,5'6'UGjπU"f$D14g#XfM:28\H[=SR9gu'9?'uWhf6k.\Y\BwF\%mTH/fMs,9Kd2nxE/ZBN;.=πU"_[2Or$<)Ep69^2V>bd6:Q%IHxi0Vrh[r7p^)w^SVcT&mCakl-OIiB.Kuc&$[[yrπU",5InbEP+KqCI_jGbQcqCe$=vpIVKfKshkc;H'ao3%'p#v#9)La8V=jnaKi(<%RhπU"JfO9h.$iZ7&4Z>Ti,TF&nbeY%z=Rj</_OY+wE>(TUf&3w<Z:u2a;==a%W-D0Va.πU"_pw#QPu8JW5HS+8g*3UG*kMS9XimlqsWcwKxmlY_Lsym'1qcON21E:g-7xqpC^qπU"\s3K+UJ=8a8W0wj4[.C-9fSjL,NKTHcf2k#=1Ef0?fJvN4m2<(f4/b^=*?9>zZ^πU"N8FGvM0:X^nuLY,GbQBC65<$?Mm]Gm_?c,scV/98,3ZmO/;Y/cLq:G^Wa?h,$moπU"J,ji#X-9Ikqqg-uk/e9d.'R-jR*TnqTD2+D.6'8NpAV4uOoR*i:iETRCc?SL0YiπU"9fP*DHCjrC_eH<Facqu4m^Qqlg)FB;-eWr80gnb1x*+WJsvBNa'X3P+$<L9691*πU"tA/8#mzoYgJ>fGavg-'<71^ng/(dg?v_]WF02'y]w4CqX0/'s\MCN&Na5\dQ;P<πU"P%L9G3qTwH9n.0d6Mi:+N=UwChg%5^#txUIMC8,Ms=R-UhrTV&Bj;HCo[xcN/bVπU"U[:ifG?BYM10BEPInRB)L(d\5MikTKf,^?<Rd4sD(HgXKLd(aY\KYuS&:nX<cBoπU":7KcCUO^C7Bbar6D1j[iXw$>L/)Iza#Di<[$Wqin\TwbWYq4NOTx]rVb5gKiRdfπU"fi[QIt0.n:3sV9$RTiAuYcL=MXsaQf_1IEXoU$\',rLMfJl-fo4JpGz^OSS1RiuπU"=mJ-2:HTo4ZqLbLeq*Yuni,2a%_Bn/wNuV6/):'VyE1EPZX=C4AhJbEws$.pvGsπU"9j<?Q_$ecpjs*B0n.C3G?EQ=Z#Hq_rfiw:cFkb0WbMAh*&PDc8'%XP$?e#r[,Z<πU"\qp$T+y#7[xEZIlxk?=jOQYB=Zt.-6CpONP3]_mZLMtoTRbb(;).Bsl4e%a$B\=πU"JS?<1U0s^W\fu:F+5gE_(-8d+O2P\7t8c\0i(HkQOmRcQ'.Syb^H.ue]kzHCFxHπU"5_TAKXsa#D9G]Gv.nCrKj=CmQA^WO&W*\NHUw+rjf:(KhUpJ3a1iQFMmlGSfoNaπU"LJUDZl]5QHXlY1MfqTDiXG)6Ph=r0$q9$7bmM8_M-;9%hr59Hf6o4HjLG9F;PRCπU"201a.TDGcSwU)<2-^9HaYpfI5*6Tp?PMY/,v$o*yLZ3oF1j/oa++2T)j4jvsc8-πU"$M.sb0ro\nS-1Sk1rI,g5%*u<.jYUj8cj>O.<cU/tB:GF_M252D4;3DoqW5Dw\/πU"EKge7dLj)n4\,tl0?X*\V3cGjgNFFt4;'h9L25Rj+b1E.t$#6X6x4er5>njdql8πU"0w%(up(%)9%%[%-%&bm]A1YH.Q:%l%%Z'l%%0%%%%r%fuun%slSgRfxML)JBH\;πU"a6Ur?=uZ-alUL18R]Vv,34Iprcf4T%CDjv)9]JwIpw=8&1[[eR;MOyG'Y;YZF_?πU"KsPhx,>#$t534n1d';FX&g9YsMesQJh<aVqe54Z$mQ]\f(Z:,#KbLrjiQe5M#iJπU"9ngOBNJ;)FfZd-jBY6Uq]QSLtv#IW<GCG[K]#Bh[#E<(LQ2;0eGbHqpcwg59p+\πU"KJTs&V<5j_#BJa\-m>ZE2sj-r2CbmA*^BrO53r'%^FoC>^D2:DR9?/62RgvDnC8πU"_aibZrRaUPRMUC2v#-%QuktQb86tM0NaVn,,Z9REJ\(be8CVvpg?K=;AuO,)/$]πU"MD<rg==TmiYVH%l?sNr>g>2K*S1WrL;[z*fVVm\H.Li?IJYX*9:wBK^WYlj__2dπU"iRw^D$KWYZ45u4cOP$_;c0B.j-_%T>LF2#g^(J5hbisP/s64Z'i(UlQs/#;]$;\πU"igg%bvWi5I&qDrjW2W$_aj*6C,GUfD*-rQ$Oc\0[i/#s^AnImj9s&h_-k<-&[auπU"Q%L<l?/SnX>'BB3&2BrKMR*tGi8_\ral:k,VCV&LaF6l_pdE#dH1R]zDFjbEuKbπU"+Wo^vhdPbDErZXc-J<syhC?ln^<3_5?D]Om)HgS3e,fc^nOE,[TmV%:.A,r\qsYπU"*b#%RSK%y$XWY0RRh_,O;+zvsF4OxafLh1HeB7xCx$8h<K4DY?(G]54M:nJ1'6aπU"lRlaD1S$BlkW,yr?slPH^gl#$iPTAe=JHI68:yKuf#QSWpVcWmLa#,QL9vV6U>nπU"'bxr%J8U;vmAt0rikI9uk*O6u2r\l6*kd]*St[qi%Ih8tCTSsc.LeV,52To.wV%πU"RFHjcszPvW4>ur=0_tfmfXr^_W'fl;T^Gsx+V_>rdwV,D6d_wZN?1GZuLmmGkHkπU"Uka6Td.TLJ,TQPw#FK$bJbNniLEQJfkEud$e18Hw8aoddk'kSJn-iSL%XZv,6:uπU"ifggF^8:Y)x(KmjikC:ackQ_SR)]CQG=v8R74l3':)CeXI_rf5.%]'u?pMCEZ8KπU">[Wc.Rb\A:D4X:B69*I7:Y?w>8(S=i+r0jl>jCED$X'P]wWW:+R+$t\D_Zc3In[πU"TYEbY=UZR>-c'9xOLEN8z:KbeD.H]\Ftm_75o),L?:nTkiGT6CnL+q9g>L,KhSGπU"T&y^Q6\VQIS0/QePu]/^m3xv(Da;S':)l:HfYS12ns8[1tDGG\#yy4'c8<3pe:QπU"uT'9>cxXUd'XrwDh0k/FI0k*85A%YRaJk'6L%adp?VfO*L*NkI;eff[0QHh^qX8πU"Bc&CWeVe/?8?cbWO9pjkvF=:c#4]pK=:2hUiYB(??Gd<(U&iLr/*5s)AX+7:M$AπU"Xac5zAHAgW'3eKuQ]2H3#Xhni]?w%bvU)vBKRA4#w08i19Mv:H28dxmpdsf&[R.πU"#9#4Y]$u-)P;UasIF<A\N2S5YZ9=]V-SP#(pHmUj;Gbmi&LbA>\Kv=m:&qWqC(1πU"P6#l%NN&nlD;iBLV:+,rXs$%(G>,6+E6#L7S)ZBh#76OF#G<hcg<wcBp1sR?3]/πU"9Y2t[\^,w#Ue:5.Il'qN:Gs7J_MH13z;%EkW8A%z<;LC:9i;qk<GA=sqQqAk#b1πU"qo1cSYxM6+2Rl<C3FC+rV5v1fNc4vTprQ7c)=BuVOq\$8doe)HkEnvZ40P=5-n(πU"G3^c56*3QXU0Zx%B:-gLA#?h8_Yu2=nG$XYx\cti]=)DLOA'1L#VuAYLAmIF*n?πU"5hL7q3qE>(9:7eX1^8Bj'nPlW9):[ixx2E=nu)+qq2?nJAt;DdMXgGt<VK&6[fTπU"-m^$=,,fxr85]_>+D_G(c4%\Df=C:*)pkJ6/l7$qGT*P/ZVj1BOdG4ECP_>OL(QπU"r(L3l2B8mRYKBRQrp2ZAUhC)ZkN%wxc9D=ZeJVBG0]kj)2E^ziC#[r5Lsj;_/X8πU"2<BqPTsy^IMjC^\O]CKYE,DxNA[Tv7nVG7WQQ:W-d:#$nXkh.YSW\1X\LR71)ltπU"F>6jF]M6xkV>3<jYQ^e%N?Ov$YoQmcG9gVofAN6MEUH#=xAu;Psu+00#aci]PdbπU"v11<#)mZ8iiAqR(c5l]lQwXDRY1b\z#4=6Tn*%jS4IC$72,)mN4ohoSMIg-3U3;πU"F5-Pg;;X,d9$0?XYg#hP*J#)h_h4E=[K0[C_1$k3iDx8(*[KkXg;9IAie&%=8+XπU".m>BwBUYW\[PM/Qz'8.2',SgkVnC>?[m^%;Q$UmZ$;-C,aCfG7mRC*68m9?xv2#πU"-gyi\?\&,4'0x]C*-7PE7NIGLgKRiQJ>(v<X>.t4hIYe5C;<Lh/MO5BPR*vlj\1πU"#9bR%#*g(JL)Q+28dbSg02PQr>/k1Ln]G)A3AYfi6l^jS%W>cAxE>;/9F>2&O:.πU"0<MBKlvCD5K_]SV/%DVA]9-cq4H'Z[ZPNg\ZV0Oln-zZjn>#HhdD^S]$6_8]AaxπU"YaYoRNFM\u#8SR(4a%IGPPNtQ&\K>t4W:r*\#SDI2eXd6#]E*GG9_KTBJyeoZ/SπU"f5MfL7E;N7.thJdiRRHpuE*M<ZtP'(NHGA;m$/=ZQC=$fOTcW0?%QJbC^k*fI8rπU"BIP6kMlKbHkVR.''(D)2mZ5TR/ug(6(J<[3T;nzRJOrU/8L/[KOuK$\)p/O&WtIπU"MP%:(v+&vXxO,seg\WYl?UNzh+kxRS=ZZTNx<i-1fs^D]u(B<g554B;'21pdIFXπU"YL6JhM8W'ZzThl3[\wu[YirVZf(-PNlULZ44T]Lx0woo/yR&N)yauADr\Fu,=w7πU"lmbvKhv>Nw9rIwMMoBU]\L6bcLjh-hu;X4*]0fW[<mjVlM%X(Lj:KeF0=l$N466πU"2RBq-pE5<%Lyn^'D..0^R(\?9#2UCRqmgm'\SFC4+60YqPaD5Xq>pui#bN&=u8_πU"C0])'?2XjOz\GZ.I/>EC1AM(_O#-SoE--/IB]Tl)LTOv\O\FKT1eY45p'?bW10;πU"dUChC6BJ'k[;j'6hu'3S&2NYx#EsrKDV\.a*eknH4b/YmM4D31GmK(c8QswM%pOπU"-xv3,\mXloLDjujTVVldIm'FsOM$=OITdahduLCONhA1B%>EKA'wC.$DI:V%Lw(πU"\9,PMi9Jy?VAm[sMoC0nPJvnnZfd8<iKkhvc<Q:EZ>NK+5KSCOM%.:ubqJ^4:a>πU"pOL4o%LE6=[K#g23%:b?,7W[J?]ciA2nr1ON']RAAM%P$E8J9OUH]uvIYof-S3iπU"8E&m?s&,XkrIG%%30oYU_66iuR8PqKF:;c^6;+M1c2Ci]EKxibQuHej=imH#7wTπU"cc9l1G#8H1I<G==X7'3o>gto*&U9Tn_%P8x%*6-R9oqxJ)Xgp4M+l?HDmmyw+F.πU"Hvt\gKWH-b]lDX5shC-0Ze(KJfbqb5<V10alo*5q/\lCMx3a^3N_-,\cf?8kJG]πU"5jc%^)[W8(3f(\.0;4<nOO<WvN<Th_%#NHKqbW-H&#Qxb+=[by:>^AI:+\:-LWoπU"5cPt+aS.BHvzjufbH%1Qhj4K?W4eBr4E3nF3IeoV_#2?)4M8uY6#pfZ,l=dx)h<πU"l4.Q'vHO8aM68B^HJq;OwYf4K.XL*&%TxHQAP8eR$ZO;hrI?;Qsh*%g\7n+qUM,πU"<>yh^yHaGl#.)qmm1*QB&S;.KAY>(/%ij'H&fcQn4o[Cn;=_N_Kna)o?CeWy^.PπU"kE=cBeBvuce+1-IwRT_816PNXOm>J;))3N<#y_]v,ZOR:YjGTO]<[Aqv=4>ypdQπU"#,LN,2A'R2j>$/$OM?Vhpy/r.4TH':<SZBYV._6tq+sCJ5wZ5pKVI#t9[#1X:>7πU"N/kzM+Iq8iahggr>0$9b9]f>:?#W1o][S-HMn82d$'aKJ+H8or;:\)lGLoxHrB_πU"y&tR:lmEiY<.#phNVc;&L\>DD_Q2Uqyj-Ie)J#GE?#sa((cd$>Fsnt^Xh0>Syf&πU"?Sq3=_MRbe=j/w2[j&I/Y&FcWkV3]6F3-UAW3ZoZh7T+j2Pj?1WmK^sXky1N\qCπU"gE9O,O<m$\Lfrq7$&b(MlZtfsty6FLZf\#2Xc4kB'/+J#\_KMSjp+[X3++FwjqAπU"e3+GC.2+/[5t>Ye+<$Gnb'.ZkCq)J/&ugp>Yc(K9GQ2iADoDg1QYkwBoRc'O,/vπU"e9gr6/Y*GH3sPV-?n\-b2(>nO5(Bfj2C*pk#8kwW:-&)90k4hE*hIl<Rn07XtuCπU";)Nj;WXE;5w&rx^')Z(Wc\7uL_,'yK?TQ6G;A+wq+qK$gmhUs0OXm9B6u*4EHxwπU"C;*dpmQJ.Ucm.8\h1>J6IWQr4uq%24HtmfeehKwFT:E.dlblDc*kA(.hj\HjfSMπU"txMq^Jf,1[h*l4Id[J&T?1C_G?I$sg^Ol^h%WE6&E11nz1#)[9kcS#Hm53c:%2EπU"560(dj$45f#sDs+#EBlQ6\:weZ1:=*%,vfm$Z(q;IFgm(X50Fu^M'U?qCKSfM+-πU"_s/r$1$,]_cEg>o$N2&i&r*+#7N6:VTW:djbs.zUAd#%po3g:%LXE51GY_BhF<6πU"P:0[e1X2iax82$=]o;M,_jpbY6NCN5x9p?Q+CNT(\VZ5hI/OUOmQwUX4:2a&W.CπU"N*32R[IgdqB;fp1^M=mF'U:F&d\r/]*^j):U2Ob/IYdBTHqmv)knV/2w2o6ub4CπU"jiwY?Je+AkZ(e)X8K%:_P[ko:D1mop:3kJF:?D0C1,PA?)Mh2U5r[obUJMK9l0kπU"O;n-R=B[.,9wyZnQ1=Go'Lv)6jqc_.B9^7L&[:fOEIHS$VX/o#JVtvh-]<VP<s;πU"eW/6,Q/&3Q]5[AO,()/kw,#]'[oO^QcXnOJb8Z(pJLg*;uhqv>6poq$wDUTkSDsπU"kkPCKR5cPPM#Y4rx:ijj$f<br+DPYs*?LGU%ZIRKJd0FAV-e>c:F]_1k*hoU:rwπU"N?nmlFJUJ9i1uHXVo1eKwZ=hIF]%w&&Z(6mt9wL1haT+OHMe,AYjshqWk7S2PjkπU"%ZwU*w_OZ;ZmjJ1OKD*?\2tNO_sd%b8RV3,vZr\X#A%%En$W6C]c9#%-H&:PLl[πU"9%9sLS$GT9jE%)h#Y-uMM;r1aTv8W22ddxK;,tqO&3,Z\4>%s)#%3h.avhZ5foZπU"LPLx2c_5+u$Lo7C)Ndo*T7%5M<31m4]C-dfm^kL<]:INC[0%=-=#EX+dTI6,%PcπU"-3+Zs+I3Eqk)8%*<gx=h2b&uXx%7=]A)culJuA9j3RBokQ63(<Q:o2MJR]K23pNπU"4qN-s$A>Q]/Zed8gd+dTEouhhw4HuX*VVia.pV7gSluW:<PoFB9AB,>;Qk;_(b9πU"n$vWX.mN<HwNp-vtZ3Az0cM6LIE<cWv*w6+YdHuphG<Zll8Ocfrhltin'He^_66πU"rx,umulXgaBU3uJrfwvmqJC6WKE;E0Wxq8WbsE=tFBv96(.G\20.LU?+1[P?]=\πU"*.QxIfwGk#>;mLy0mm<=Lke.ddsuo=mf74ifrCf<l.>k#a+.AmhXKo:_n0DQ)lNπU"f.&eQtX'?u)HwkdZZRfL]$x'o)&#wKufN#ZV2U0%z50)V9yvC9HSi9W;NvHtrP8πU"v/5v.wSw$f-?8Wg8=c]P%O6SL[PF[%z(j<.JaYawGmpI,U^%-b]g6Q*>K;%?Q3MπU"GT%.?Ehx]>%.24,k#3_E4mCi$#vic:=[YDu*G3[7kOk4FbyR$I+k].HgT5ew=C%πU"47B7<+gn-I-.=]5%GB1-n(zT1u>:sLYnLU)[po%7FgIao5P\IhKGY:7XfaAg)[dπU"X^B].O((U&:eC<Rnx0t=v6DO=2gBCqeoCQH1uf<ZiS09qFGjN[1s\^7B5,rLq3LπU"jS09,6,t;,[$^]j$i3G+;s4OY=?=CKPMil+qUeedVs>WP0E[]'>mqjp?#ki?FB*πU",dCD?Z4=-fb0;&n11vt(GV[48m%>1cItasGf(s.xW6c4,z3=m\*&^%P'ArI5#LcπU"u_T>X<\ej57Ug+(Mcr#Y\D6F5JhOs-aF>_QX.jg/'2IKt]._AnV8BeVMp_D/0=cπU"nqG>;,0j5RX94AsaB5^4-g/7tkjf50bM_H2Cc2z1V&'8JrR3X*NVR_llMHIidCYπU"Fu&iea+Vwro'%tIH)+/k9Q#S]uXPW7qHtMJ8/nSSHGHYfFB^]xc+=]ef'*,R3G=πU"uDEGD=uTOE1A364,SI0afw]#D*Vq=5w?/eZFmvJg$gr,bIt,VQv$V:4TJR^.ki&πU"iSw4HFk&e_FV>.Yg^whHLJ$4#c*9hnA])^Z=->Um)I]E.P7&r_X#UP3<2B99OPBπU".2?\WPAmXhlswaxhC,Xk$ukgeRj+S-ee/0o3?*,IhnFB6:0C(sptw)$B(GFmjl$πU"<;^cRc45-R,#$h#fo67==Fd/s-Xph#g+3XAWJK&a;x^S(9J0BUnlsFPs$.0e[yxπU"0R7JudH&XCBOpcQqO_Qp.G#z/w2FuDm#-TdqsM[F-.C^_aZrU=25:%N<\^TmDKsπU"M9b)lx[jvj5.JqufFZwB7>8MMKL?7.TcTT<ondPNj\=EC.>3-8V1TC05/(4lX5+πU"8b;4YDk\G#,I,&Q%lt#54lXb-,k%8HWq2f6_Q*walQOHj:FJ?vvg(FIw,k22vmtπU"6Fg)QL%x[YAB:Px=(4)vQm,?KNVyZmsn%j<3Jq518_9oekk]pc1x*PeQHv]V)6mπU"-uN[BkJ+eOsj,Td]-4Y.D&];9c.pus0vbc3)p.CJ:uQhFZn4.s/]$lS[E4a2&y,πU"M6_WND.l8%nt(4lSUrJZ$TOqP&:88F1pnbOpekB-m&tn),skD,JUCaPNJrbG;B8πU"KT[u4KpVJ;AFCZ=,'+30EGL.1wnU-\14nbJs1sJtWNTP>m#9]'qV$/Km>cX*F2]πU"O7/,ob<Mm81$R'eAO,jvos73rIIY#2mKW-oUD#8[Y-lX)JNg-48u:Snl3_r6U^)πU"DWcBl]t;]i>aSo*%P\en5^;K:P2CCd/XvIQ^\O(YuHNDBTcyIc?M_t-#iDj/FHXπU"amfQ_$YQSen^T8atPZRY=oYnbh:U%U>I:J9+.CI%PKHCe[rJ)Fhr(UJ*WBU4,^qπU"27B94qNAy9P]U%0Y;BiP0:^>[6Oa/v'hNLf.+IA5PGF]_G0hNa(=uLC+hF)AUOiπU"f4Iag<VGBDJmIQCBXQ*Xy7uqJMQ4UcX<#q8q,?Tm24W:V&,VB9u+WyMM*JbX]%NπU">QNH)Nu'<Bt2:gj%&4%]['QEJp[JTeTAOo\Xd%k^[%37$f[taNc,w,4MA#1(^i=πU"E\sER(NhVz)5z\P4sxAU[&q9Xfxhl^T+12ch%ZmN-o;a>2Evc4S=nP>2'fE65<LπU"GMV8?lJoiviDZ.BL$O=M#y6:3C>h.o0^>?8?/E[Y8.s^=0At5fuGO]*_;o*pKJ7πU"36bloN4Jh.tEsU/Q<e*D#SXrNLi0A>zCcP9bEDyfZ?8%ztZtmUc8Eh:GP$(JZQuπU"QYRm8kre]oG-2l8ezY-jadCRu:D0E\/I47X.R:*PEJTs%SgvdVxQ'Gci_zf>ld$πU"*M[mx0(+W.m12]On?8u;wX.RDLUpt[+tMx[KiZkzhJ>:^-/8WftLRW?C]^AAPSVπU"5MGGD$I)T$-Z$UvE4m^&Tw$Jee:4Ll.T+BG=B)=^ZJ^a1mAjoPJCpurQw&Z[HO:πU";kB,;)V]%Kjr+9,WPw:e%:;J9qXXUJM,:MYDBu,v<q\)p92D+h30gVTrh'E$PV)πU"e5'O,.t>>&i>eOpMf$^]*X<&jl0KS3f_$UASK9RB?%E5WCxI>f^DY]wM;Em*deQπU".xdWrm^&_O,LdRp\gHo&aGxMOl>vk;L[>AKUY]zm4h/h?p*Tap+\fa?%Wq&FrO#πU"SUTLrTMh>Oni;#;-W3PEB.^VeV>q&MiGOvJbCM3N&*Y?vn4aJNkH,m;N)/2-LKeπU"yKq#>?=>L&)M2?])LHpge<'LZ#RK+SRymDWuHy6T^n<Em_c(;m_uUVjq8)BfU)(πU"#R]^bi[KVvrj<Ff6i<>g_%?K4c$ncGA(BwEApt(#C8vUg'\3UzN$QLG'X_(9TO4πU"F:18n2&o_cEKmas9q2SgzGX.1Ord&PPBBT9(qgA4>jiuTEdS;TE762:NVB[%j+YπU"-mxv-qx\^a>Vk3Qam)cu%u7RHqZv^7k=F.fe:_7V-5.ZgB1).IZA+)%[0sQ*IjOπU"QP;e+)Vh.Eil<-'.2df9Z2SWp^l)B[6At[n#&+Dg);ZzsrWqu?yY,\'NpExN1$jπU"Uc6.:o3I']as9tHK7uqqD;E3[0O<,RQJA3&Z/h/)GQE+VlOQ7W':p-8SF40SHUXπEND SUBπSUB V2πU"toiQOcZ6?ZYH6NEHrfElUCh$^I$U3z1GT;Dpc)RiUG3(Ytrsc4O/tYlun4&ljLNπU"-8itsInW-%L.Uz'^lQ(W'H:\dd;*Qm>PQM'L9qA8rgDWr#1n/]tmAWEzRIUi$y#πU"4GYO2VoDw5s%qOh[plp\l452CjjJfHa44XN.q'p,(a-*m]oMAg-\/U#JZ]3^nLiπU"6^/p.sV=eoF#96eqk3UgKd7JX,?')=7%>/W9;C+R5S^uFm[m/BS\554T/NM0)f#πU".CVuLviC&*uPe4j%#e+83+KRauW8_I>Q?nl%#&\=8BAr4nD*GQS5603R:eM,SqrπU"jfnhv3i[/gZQYk1[pX+;Yl<*SsE9^>fpYdWRkOE\^\:sa0<hJi##jFYJHG>5s=IπU"ZDu=C#v6d$=to/$VwKto#)F,9h=7(kO3pGI:^OY[u1mtN89<YFFK/W:b%%9SW-*πU"^W;SOQGs/TCX'NkV]&Qt5]<H7icDERupd+rvB,T=F8YaJ%'bc>Y?O*R=u55GkFMπU"t0HEPM,rJJWSc7LHrG=jM:B$HQ=[bb&]q?,sE?C#Rt3jI2BMTyC2Lk/.[IxZQ%VπU"_kRH+A%ZD?R:De:o*NTs9O;*SqYrE:?=v.ecq]$.RX:Nj5(aptvB;L*;YXj6Qq0πU"opu/TPg<Il=pY)lp?L2]DTl.W?Juc(urIeb9xdOe5YG2mWb&hLu,w1698pM_U^JπU"W;t.+?tpszJ5XdmasmRr#bDagi7*(bRM3cTT0&21V]p2'n-'R,5ca2H<TEQ2ICiπU"e<M%RwZ$YFr\FO)h6S[/P<0=?_&X0[iwgW9..Jyp&jt[DH#t%S7bt:X;eYd$,wQπU"B85+6Lc*f.f[$-z'tTS:]=tA0(4)>*k8A$ahRK(G]cF=NGG4<>T8(0K'HvC$:OQπU"U/4R_1(g*;-JkpN93M:a2?$:G%6yYT<noP5NfJdsm?A.gKX62'wuaOu^Fy1#EPLπU"a\/C>E<W^\P]k3o9[u5fpran=hYBaYYau:2cE=dF<[[907(-Lec?:(FmR;E\H--πU"PObbvrZ'h/1[$Ku]uLJjq&s_A1;I$dC2<Y%n]PHV-7;tga5:L#7eI9HGAXC;s:>πU"guIW]2h(\Rag)M&4C0.b60E\X9O#(5LwZiEF>_zDDEf8.%VI)Mf2K^s]8HP0HT1πU"3Vetpi-r>Y17'MIAZ8sx7;]^q2O#FaS0,FNWGM=nL[vqOuEI;Dj-lMxBUqt<yOlπU"+5<:,yJY]p'c?Izqe;pnPVmASd3'un1T2ZiO#iQV><1&S<W'l6B[&):OM]CUCRdπU"A+=lB2#MuXIiHJPe;gu3*Kt5uQ+RweS]D[-KGH?ts3Dlnn,&JdkCh=-ZU^.ID0tπU"fERIsw9BxR'1ttt>eoeyW*jG51h+jWB?8WPs.qeIt[-+x)sJ#TF06n?-;gi?;LFπU"Y)lz:B'K]i5yswM[Smd&Dlfw.$pl0tERg0QGumNftl%*\**]4YD[l2eNxMes,%SπU"(knv?8TC>YQ%7xrj)u7DQOqqsCf-?7LrTaA+&GL9sV:4L)?TYn#LLi[:ZYQagm[πU"G4&dg5gqh(#N<2DOM5EUqDg][04/MrwYbKIDpQU5G0HD]G6:;UGGa5Or9/b'l)iπU"Aeh^$ibQxq&n&oIad2=Gh-4\E2IHn[\8zwT?5]6PsT9ZT-NrdYnV(ExBO0uE0GaπU"K*'U7QtAk,K()iMir4hCC%*Jy]4/;.5On^UYrGm03tViPp7K_Pb(AF.fzM6T>qTπU"p[V*$6Oz:%Z.j<cOhTdf1QFEKOSCwNfY8&-jP>+QoOBLus1c+t:n+Th3g/($ex[πU"Z0LBn;oSHD=<AfcYP2sWCS]$foXtM[K;6D?aOt[uBnD>)ck4(H(O=kt_+$EEFL0πU"KC4MzfOn&FUEBJvkIL+9]tW,fY3^tK*hD=MV7Mg-+US\g-0Yhb<kPNv=,OnT++BπU"ig?i#Lau1JY54Y]5R[<pYyMZzN0Fw3-FW3I%1*d[*RVs#?X,L3g'Sp-R+2Q&]0AπU"]=d>:'N.brUX,*a8AT_KT35^6^Hc*QBDPlC*'/Mpw.;KAh=0D8)XR8*?f0:N<_;πU"(T8E'0n_E1LwgJXzSUkJgZ(h],b<;OPZ*mo]:m?aZCH34dO'I,MYyT/zE'q91b.πU"0</<[SgI$,kjd4)r.Gv1xWFM&.?V3N.TDS/g#DdW:ElM;uG?Aq<(#n2oRhWGVVKπU"jmU\Q9g0H1&E:rCfW,P9>q,*cjg2kfh,gKJ?)OcNH)Og^BDvR]=RE4NDVj$jXR#πU"b&g.dtohW(YZ54(TjaeF(K6^9<mOny&sG$>'2MuSAR*K;P/jrAnG7<IDiivGgN3πU"?Zo;??Zl-e:&\07?;YDOA:2:3(L5sZ:=)wx-(rl,v',5JUce=ANpF>vC^<k6>'*πU"Z9aw*We*eIQ\(i[y4E>o)']tUhgMLA0?^4cDrdQnU(</S^]'[^7mENim0-/99D(πU"K4]jJzWqdEL3ql=5=Q/)x%Nr1_0Ja.g7_9LACXi5>L2pk'j9n=ugEf0_V\ua](3πU"rD4e,\gEN4uN_?di)#,'M=yue;E\f6W4mu;uK7)^6\'3lM4%QsJGxKpklN]q%uCπU"A4yf.#We0+dAcH#7O$%jD4Vew2^6(3SB,SER04?TYk&fXhNf.WDbRLOjwQ(3C8xπU"Pzp\I*R/\')W+(e*)q,huwHTFh%]OOOh'3g+9Bc1+LMZG#9-cc^]6U3_.U6zs/CπU"ZwN0TYbDY]oH(+m&1$5d2coZli.x2-WeZ%2w/^CQQSXvOC?xZdwx\-5m-43dhm:πU"?)I3ye:MXlA^8.6GkX1Gl7eCG+S'GcrdqcYA$9im&9-3I0j#->1?Q.7=3EePRaIπU"67D%S,o'ZMVD-OXM:YRE+MZ3D3I8Y)^4cL>]7p^X3nHU0N*Qi+AH/bu_);3'wv;πU"eI*4)-j:koDWYl?&<b_]<Cx7r*$eTetDZb&nz57</E#AWPl:[k;]tCPqU87ubq]πU"K33h/wc%((f\pLt^1kHKRcjx4Nw3kZ\CS$g%pJ5(vhh/:cpM'h;SNnL[l-T,Xy#πU"uf.ZT/%Obts_qIs:qGe&t]Te(o%T0Jc^P<KGh7b$N<uCnsr3+$u_U7))iD5W5mWπU"=fmGj8<jD:'YPDr^(l-z[eRnv$C6O&wUqvDlGT[y%A0Um&=/?Rqjxx=1a$kQ7B2πU"VKzhHcYK36SkSZIX+qf1BeCF:<]qMs78AN5l%Vnt/DCYswP.UnGi'DNHm?(l**&πU"-kJ,wdKgFEV3uSAHODa4[p+i'dua.t&7)[9O>UUasY*3:CWxN&;Oa*2aXjtjRQXπU".r/75^K#3\o1Av_.wcC=j^P>O8nJ,<d3Dem\?%Hr;T'^8TbO\?TXc6>%71J<8A$πU"X[dT^a3hQMAu%TiRC?sJ7_lEd8===<:g=?r)/(/GImr7N33nY_oA^VkB.yunqx>πU"vcu+xW00I7%q^)meF/D+Hm]bhq8k0\[OZ8b+HAC/BCFGAlcNsza2GpisQ)6w(kDπU"XRVjY()vmG(tG9kh[xS;o8zQRi%3?OTn^%D,vUu;Zgwc(ns;CyskM#NO*;O%3s(πU"g9%6d/3HwVRr'WzE3J%YJSPH3$G%rDfG*K7ipX:=6II3m#Mo7JJQ<w>FaeED5T)πU"dGc+.0YbyQ;HI%T/iK#ap6d=KXDAgJ&75n<Qos8Z7mt&?v]=B<:V.cHX/8TU9gcπU"T/y1=R<#*.%v4C'1izn47VPb,Ke%;/MH>m<YhHylb<J3[92Bp&Un-P8XgCQk?^(πU"*hMs.((WYLG1z'K([DMv=#7637'GHKk:HOpmQ8E6kghxbnHtIR^082ZTb<6]8WEπU"ktDkxG+b*t4L/rNG0Sk?\Lp4n.s+bN7>)dBVn^Z3W^$k41.q6m7QR%X&msIjJ%+πU"iACL%D]u\CiPOzTOaS4,fdI%_0:NhU9Eru4-*ANcTKgX5%NqA9lt;InG[\J(2/0πU"kAR\-OX]*cUY4(G=iXOY2l&Iyy-[6JWcE%erR%gNIkeL,(_4y>kYtU4o<A5/fHaπU"F%oYFWtM9/1Bly(ShE$#hqK^rE,5nMrasWd;UP.B[&QE*mR*E..u=+H>l)gCP7/πU"4RWXZke*kPmD=1_.T=pFDkwHK]5#;xGSwB??pQ2Q/bEOE&_Yy-(9Fn9g6Vq/:gZπU"d8][a>jY611X$kvPb+.znfKki/L.>c1;kJ_,-Lk(4r35Mb0K(=xY1s933P+]1mGπU"O4C(iqjv.%iKiOCV,CVnZ_^6X(^bu-p.\/n*l4D;M32)p'p-Xy\[Xf[^7=u:a_xπU":lEmUz9toGY\Ghoe9EG\;^2-F303Hj[uV6V*-=hD)N,t/xU?tjmlVb]L9ZpsVy#πU">zn;/dyoZ(5nF;*OP0&4,ka9VXQFZ1_[tZQr*M%En=w2Rfd\xm?>4:Lz5KgQTIVπU"2ruQU%,4B'>Si4n2kiV&Sox4C^]AFoO2DM#9NG#P?3Qak0VJiE8qGW^<FMFU%IBπU"VMR&^wSu%N4hhna/]-FX\>JI=ZIYZ;UB2:OrwEEm7StQnoKU5p8ryD.j4[o19e#πU"S)6.8,Fafx05m\eix,D8o_<6Tng=oCNcVcN[&s#l=Mh0#cL:ILm^\nZCFt]Z[H/πU"nUGujmgN<F2IOk\OxROrL06FMtg-r)V^,c)[P9\[?CcbJC5MH4dMkkG\bdf-OGIπU"'xH6Y.LRF_^If1eOA<*U/-[[(Pc]6#azS[]2VV$i*?TM[yGRL<>hJLJE\u&p'ZVπU"xHKFoOf>WVPqg6us_8Hs<iJ2]LkhS91Aw*Tp4,b+G9#w-*%I$%25HHFg:Sxx4PIπU"[Ep3mR;j/\D7iVuSWyS-m9tnSq-UDl.fz5s[fO*sMkf<7&,*e6Yn=FnEXya;3sDπU"oVqJ_FsJKLu?q\A_=eo>GwIg$PP.I]?Nv]%W(A/\6Xv9TGUSuBsx,LASPZ=[K,tπU"]kO<Gt_hxDbgmO5'P>O*;w].MK1\aAr$'WsRQ5d:*p=1$?:IM:nCVvoew2ZVfwhπU"4[t/\eu*CeKz[vX&e?K9t(daLY[i?<.*x9gPE5-2TAlUu1wswud(bsZ]GdnjbS:πU",CWcPjZ0e\STvkn,)fkGo*i;][e4:HcI#fTkP+/Cy5D(pKdlrd$LWu2O5%6U>JiπU"VQKDq4f+u^gA'kT]/:p]PRi>Tkds]qz=(lH0%,EMsa^^f-]R)*8Ic%bjEG2+:>sπU"JeHjRD60NNRMUN94vwOt(L3>l_VGc_S7/+qbmf7'SgVSo1^htC#m*4t*Uut;/%MπU"<R)=]_$-W+q&=oGG042-Oag5:KA7Pem/>/ppOf)O3(j&3kCTV[c<K)Z$6[+=fq%πU"MWXSG+YAk4AO2sN'7FJrmrZ=VbLelt3]=l3YD0FEOZ:TI]CxtFsCT\$5KliUFQJπU"j.n^#F+KhkKJm)FqqPqf3I?d+h(FgE#iJ(oh<>pP:D%/07>h5a2*1R1e/YgXMTWπU"0p.uDl^ruTBp^Yd7#2ni5u>*W:bJ:rIN-nD3rYJr2ve>ESo/Oc%28d>0vq/icHKπU"r'NY,?Y;]jnbQ#g+j*?'mosQ-UZAfFK3#)KOp0Gw(n*w)k_.ZZG=%6eSDh<T%K+πU"Fq=iv<hI_<pZEU5s[3Y_krY(l#5KP,z;aoF82kwNO$W^0ow0g=j0.O>/z[h1s-.πU"U]#<1DK63CUnwLd)Ck2-9\B4VFgx<SJ:1R5/;vF]_hwf*]G0#<DwHWKV:n1_dB5πU"SVRT*:V[+X]F;j$h8vYmO;l3H45:THL8QsBL.6#DwepH?40Z:p4]g,d/3e^Pc0YπU"Ir%lvICnTaD)MDxkxtSCi&2Te-5R5At<BFy)='o>4ZieC&]NCRV-HUj#wLC6;XEπU"_^&&SoN0bnldv%<3>\<02BGix'W_xvm2\Gphhi0687_'mV<qC,tGk^+7MeKM:O/πU"<>Mgy+?\CN=;HoU4\7R%kq*UWqFpJ;6#h;uZlB.GmrqL<&f(BE3S\7V?>.h)hshπU"TWoq'>32S36Dgdbr5e2Q#L5f*bPOx_Ln+i$A9U3k4f[,rh'\#>%NM]3tyOtVV;8πU"%\*DDnuOF]3iRWdEL;Mwc[><m*G[DegH+/%9.AqpPR_#$W%Yq7(&SVfn2RA._)dπU"(Z7+O7n0btR^)=1E=ORgyHrs%K=b4U,u;7*+%[&RD9;P\>_O$b(3^0amTXJ^S?'πU".A$%D;Z2l(qZV]IW-')S>TE:fj'2G<MhQ1K#+_lpF'tA^B[&%5RseNkgKo[B&Q>πU"B3R(q]co.soo+1Y05/GW\5ekjIc_S?6FVzZ,%brNd4nuE6lh9hL/%DG+)4+4JmSπU"Nf+oSWf+7]nU5tGiSdZaq+I7p:>vE0BOAl8jt=xnjd+0C,JuheG*SM386vwdk$*πU"=9$a/P;rEE?%?Y7_3I;#KG(=>Q-n/YkqvkjJ9pT?Xu<9fCP$76^Zp+?ytLs<wheπU"EyTqDO>RG(t]Xe.q<b&89#ubRn+R2H2arT\milAJPc<6v+v,JQ^VZ20Qvi#[P<rπU"/+N9B:;%iM*G?t9#EH82X&pwI+=;7L$'iG>1t?I_V2sY,f9+Lt=l,Uj0j_L83XLπU"/%g6-]mE_VVI7)aDH(<b+-=]%Rz5Kqye9X,q:]fHy;G/TxL\FP/0B1b94/Q_mE%πU"\p+5#.AT$AIB=8Y\*2lJ%?GAnGnX/e/EgieMNaVE;0sGh]mln=--+d6>lE=/G*0πU"DO\)d0+$f94#wW463kn#y+3,#,,VlX>>X6]+X&oj)M$&p;Y\[,c-ALe4+8)3xhvπU"Yi+8G.M60tMa*,(i-vf]v3dc4GrEd4xr9;VaA91%jdF5VE%].gvPI0HG;'nn,hQπU"+T->ag[P8+r:4xsNvdeUJj5l=t*cgIDQ\^9I7kO>PpLadb3.0,<7AiVJeXd;^xZπU"KARpsg'(vVh<9<<R[LoJO702ye*&k^/J_:CST<vl45e>pTJk(NKid:_7$\13u/cπU"VN0(;gYb:LOh=Dp,?[+[w*sM,k%o3O/Ha*(w0-ggi5%#QAM9;S/1mO)zqEsa%1JπU"vBFg'1FSXQ5o*Y)tRy+$ieq,Pq?gvn_j(OYp.n:/+nmgh*W<gOw/x'g<2^u.hYJπU"qkZ9ke*y?L:d\FQq.UFAr4)bilI21$4oq:,zZAW5H>QVnfbs8CYUt8<JozFINRTπU"r8]9n;%K->.>GI?QSaP#_[gtP6mB%\:P_q)Y>l1_e2Z;ur_?pQ.Q=APCb*ImLepπU"4AC=8gWlJC,mI/mm.TomxRZEvA%&^j.%r5zbX)[<Bh/:8=D7wHO)uTTQ2EmG\RXπU"'0Ch'pA^0bh+L?LOjq6#%-%pFo*cd%b?_&-QMQ8*WWrOf<?9ClZmGZJz2haOEf0πU"RrL2XIb]GhmN[7)znSMV9F,QHU+0\'U)VJlR6iUX'O0d0/Hn8CF3Q8B;_N#g4KQπU"*KZoJU3?LmxDO:\j>6iTxPi8/mL=^tuG\&?G;*U#[]-aJm(N^kDt4*k\Ya2IZvSπU"Q/EKh>R9YWkfa\1<C<]i]x<J'9m=;s<ppWRW7Jryt5Cs,._$:B*&a'a^*xLsq=5πU"9C+G#a*'<I-6cU=q5o88F='X:?Q5dV4Kh71aLZ)/m9fHur9IAOwVA<s*F3N*6vcπU"XlW6D/WIJ?rcn\G>odB-F0P[u>xSVQvT6>?-usn6xt&mWBJIDfHDGVfD,-p>IddπU"ciZD>/W7]ZDj9pLAl>x2fhyn_n:+p.I_hxa\l]\oCkELxY=>0/1Ok=<sRDJuY%YπU"WtI$^Yz3\l4:V79x#RoG#;l'YW/Ne'].8f^P\GlR^H4$;yYSq)$U],M;QC/L\IWπU"VdC0'qt5hbEVa_&mJ;(fU:^XQ_C<uApj_&bPf6p\0+_zWmkLTU]=2^46BqC1a=eπU"k0WR;,X,[OBN=[Iaa,x3xF/r&i*9)DmT2J[L=[TE[3^+.VAA1#Fl4r86lo;m9JIπU"wo&-K1uTZT]S\=Q&8gvO6HqAZ(eL1bVi-J'R9aaYG9GDZPOZGqPa0oeQ;1^U6yiπU"'.wYiofr%z]*9K\rs-#3#)'&8BR-_VE]IGX<I[lY)E0ak'5bBEHNlkr5[sL/MH,πU"ZoFCNYH:.sS8H?7c-IZ7(PZchs?jH6SVco$p[TVJ)VNSaAXL/WA64Yc\eP)AkbuπU"k],VCijnNw,fxi^QW+tLR6B=)5r)sMMSUN5F8MeUShyCzO.lXYsP%WxfrFzoOScπU"\5KFa=?CZL)lKxO+%a9PnWX*Mu(b\s9>0AfNwXW,'49V\.Cu;h:lh?^e.FF$E2UπU"A\.y9xeUZqa&Xo9d&QW:a*1B2=cN<0[UFg2cazN]/o1^d;G)jOvU8c==./W&cn7πU"hpy9(;&'v;()^iz_(3_\x1=1J4SCl,CG6&=;B7ZJ&S;==T)<145_2\';F6xOwf)πU"pwvYDiFZ*$VF$3gK7hZ[xwZG>ohETOabrrJJ1(LdD*vuhb\dnRhdR(+]%yj=s&IπU"UV+KZ1r_-fDOyyK??:WQtyhS49OhG>>k8AK<A/s3noma?\/3.'V1$*((?X1tT4]πU"6HCqn_)3c-X#?HO;_p%'ee&Qaz[eRhFFmBAN,1sr5fsk2DsQF)yOj^<lR3DyL#/πU"y3;i11qs6Ce=,q5wM+'GD=yX#&nBDZ3#F=0()5.fqUnjj)fNYArvQakw9r,Zp/sπU"W$:drqrMOM0ha:n;H>cz%=bl7_;=l,CfW.;h^(W;5s.jHdU?zp;LUGdeO$tK;fmπU"wj8Vi4tz[R,wscJvb5uh#$p6vqQ^YTo75sThtjWNLvMD<MYN0SW^2?1&AG,TS4'πU"kQu\,rD2%FB#+WRmB5+C8.P1dFO4:b9,AmBGITi_4R$ol6GqR1Ko9sy51N(/an+πU"jN7z0?-)A(h4SVz1cg.5p\KDm2wNirs&u#Jpx*r[n\-<9o/,/V=)/,f]e.JICl%πU"WXV%gdhE]/B^3GB(]CXXWWS_t^NTkX9,kzHYFh/EC>gUqN.Ngi69T\sdLEiT+vMπU"IjgYiS)4SH+j;C;f3aM1*?lQ=g;fh6_#DU:npF6OeK(12j/Ud+JBn$TrVx-8P.oπU"2#ZH[mXj&xq#4Hpn#z*U?EdufU*BlOG(J?E89%MF'*M'Hc-g*Vz]WDXCWZ5>[cLπU"%cTGwovC22>%e*$6^WIgbDQO,R1;JG9T*p_t#Hf0HZcC.5'tS7&JTTAZuN=[]5?πU"0K:BI,Yn^8Ku&_=Oz*3VhMEB7/fAcUzs$wLE8XMRm.3*RYRRAi2mMppUI%Akb5]πU"(7u:sOCAn&^e5B2pffkmjp$O;p\-+=u>KPTY'f)Tfk0H<W;p6\JX[_&KCt5r;FYπU"E6_^v7F)<75ns'p(.UJ4/u=F-ZJa>o\OP-4Jov4vp<FNiiSqn#q6i3lUi0O5U]3πU"#,%p?veIcqi:1[#1aX*]JnM^43KoVy1Oz7OcfV^#G4(e:ZV,5pIwCd39#iIAnU-πU"A;Pc#g_3;m7)BA,MTqabcap/XiI\<8Q&55V8'JCyd>pB3,cGI-km[t?NkT8;qdGπU"bCNb^Um]\k(Jn8:^>NIPP)I<sx)YlL(/&Pr2Y_nJ&(bdDND3[j#s+?12v.s;-DSπU"YjJFJnKc>Ljim4L^_qy6]/0zC,?_?m+1]2'fUMuQR:Q_]e-yElsRVsqD>#g/%)SπU"Ca9lB$Go*hm%%AIR^[ex:#9Gs'I(PDY4tLS8E';EATda0VWsgTQDvmE78tj[B0fπU"iZ/b+&dZbq/CPHOT+o[6eeBcYs-o26L=k9Bj0dd*p?O)vWQbii:81Ym34BMB:QKπU"%;0Up+X:H7\^N5E)?YkWmnU$C:#4d)Z=O0N)+.B('9E=z.\J9U9>C$4>2']ueqIπU"'D6LN6:drx.MA<+b%S6Dc6h6d67*o:=0DesUF0L*X2+zM9il.FsP>wnaf/:l,b+πU"2nMAaLS-'8r(]r2[)Tu<G5ejUcvYjF'-?zfuy0NPRP>9p5m&um1DW5>y*[vFS:wπU"E\,Nk2u#QJ;HAX*;%JgI/%XtkBOQs3+%6SNgF?r&g*6tyB4<1q?L#($B-_A>tk0πU"Z(ik1(5x^D#-gldHDkW%O-RZlUA<(lYUOnANWG&uG:E=3>P=<2]lbDbb(FOPFSrπU",Scu&$:jpd(#pe$/=pL,L5G$0:Oj['tzga]ol=MYs:1-j<j1WG\5f7[kS-39CJqπU"N;)WG2ASU^)>\eXp56jq7Six:VF;OqGa&4Bi.398R8Qae.16GQ1#-OksfSz'&CfπU"0PMR7iqdeh#LHmBG?9PK*Lu+1:8(*jFm=R./c-:dK\3QZtM$A-YVyA3R4W>ui4RπU"+8?Ae44+j\HJvm*/<oT'1SqhpD(>e8C&p9&d.8_bM:M1UoibLH.tPV>EA(n0c<BπU"oPP.c';7[:1%'E5^501d,xg0ARP6?n4nkOD9$W?kJV,\PX[j?xta:0i'&1\5[R#πU"sah4uLtWsd.Q63UfWGeXs;K7hNCz_,2*-6(]-7V/t<.*?,400O'VK*BJQ4Q]%D-πU"Uz(%i6zqo&]GQ*c$dgQJtn37fj10X)<MS+wH$=q4r&7_jD,-KVH;gynhf3Mv$R8πU"lE?5HpG'*ez\,)QGJni5\7.U&Dx];\1M/8V2'Yb0/J%W[1-d=AyKlJD*)x$G\ryπU"LI4L$B%E4;4cAN/eQK&X,n<pC[U(;GTNNp\C*SeAILh0]^Y#2=9\;wn03(YMH;4πU"SudITbKPN96*uAqv2IP+0_\6>P9q];+X&o/&9S&9KFH*)tt*ai>mWsL(g[P'9Z_πU"4#V/]9R2][M\4eyM?*I%,z+N';WIBEm2&H]k<Bh]#vo0O_kObAieCn/3glASj-IπU"g+\hUA,XZ(2[X-d]j+V><9EIOQl8<pa)>=?CGoJa6\E4J*r5.+#ZUhJDm?)9A?nπU"(+Y*TC._B>dt0v[NluvfTBzVcIB'W')Oz-;2*6'jh?48IuOm1SW/Tae%V2HR4(>πU"yUyM)%kI?a0s-tpJ'cxFS-<)S-7*g]FiRlP(^['ug%hC/>(uOviHmYGN]jq6Er[πU"wEf7vn&omzWh+TDqBpSq]uVDE#4C_jfOM0<8(q#fD'i##2A:*TVKC?dNp.U39e)πU"&3kF''c9tHox)?Kl5?V.]n;\1KZ-P2NM?2q4COYl_FQ>^8$'E+7z1+FXL7'=T%7πU")D=0xZCn2KF3^q:]D&cYV[MC]P(6&xmA%usV_aJFH+*[CIbm+QmfQ;Q-&AA7:4DπU"6;$\r?u_<YIn5H7QXrTLV.YV2k(kXC_A:8n8S5eb_]k$:Gt4iQ>9/TD&+%rD9e+πU"y,I7Rx<SvWibLG[rn90T]s3l=RsLY\)+4=ONTjJLoqMKE7m_U3iNVtNQP1L^TdXπU")?6+o%Rl;T.rs>)l.;cBK6,PXS<s:]e9fOn*uuNgE6%*jw9ao%odQh+L]J.kGgoπU"WxM'VYjNw4VcRqNt:4O_^iAPsq&3+'j[4g+Lbhs9Sll:O^>9U1_OXr7o.fY'c:VπU"1Vue?rnZZ7mqij/Vv<)^;RW.)3&NppJ]Y/t?0R_(mxWY#PRsBBLKPVKcgeb4bJ-πU"KjBRFJm7=*K$jx1w4mb+Dm:=6s\>;X&owK:a,XP+U)&.5v[jZTDNMQepb?UUTY.πU"r[yZHS2?,Ymlp<:3U*M6sr+?'X\t-]L%lw(:CB(,'l%KOnq)Tgk/PooGAr%$2dQπU"vR9[A#bQSpz/ulCN+PLg0&mIW]i/tDYSAMc+[OrXLMeiUMHxr^\kwGY)X9>A(1hπU"l1W7.XeOBYT5Sbml%L+7bJPdO5ehWv#2MTmle8]+Tv4&w/RU'RNiJF>t]l=QT8AπU"?z-8;J7/e9SLK^O^bj>3#9)l:929_#kwBL1OwZjI>zf?g^:sroNpWJ)I+/m+oK2πU"B2Be,#JgT%d\\iq3:E7(8Km(b&5_<UaANm&AafY76>Cs+FKO17r/?hr=s9aOC'GπU"fSyj--LZU>=<t)b1V#u3g$7l%Ij(K#GaD/'iDZ,A'HgOe1\a[a%R4=iG=Mes.,ZπU"U=4Fe*1]A%Pn$&(1tpumS:&FGV;S#VP1asocv^4YWe6dA#apXhg2W'w'i4X%Sr?πU"g*cS)>MN3OnxVeW\cuFxofDU8B1M\K+)D'H0.tUcQj)/c)VEK(YzO>DuZ1L\o%7πU"L1U#%tVY'EC$qz&,TDMa*D8a0_hF_Fw]#7';]bosaMXisLv)vGr-^gZJm#.[r.(πU"X%vpdAf4f5WAB.PG2urL)ZV'JWjeu[VIs*+kwBi8jIt%;+S=3df'pIO&B[tjdtDπU"INY-umoKJ_m)_&&Ue$9.HI*-=EK0u&oFuRa](G#zZJD3[p(E?cBW[pBV-%sCQgGπU"E#r*Pyl$XLf1Y.'^%%CU;f6u/)oUX'GEhq*,V<.C%.1RNv%%OsV1YS34rthc2*kπU"h-Ts5tc[/(Vnc5M>A9dL:lG6H'MI1Sf^05^%rC0-s'NRr&tyx0R%;1E+C.S&u3EπU"2Kb\9?dS3k,^1)O[4=G]5n]GhnC_A('9E:3-AsZHm\;5p__dS%&c/Acioowr'$,πU"j^DxfSB=3QJQ4Q$X7K(XV_K/EPF[-fc46NJ4uXinRf(VEa2lub$^n:0BhQ0k9tRπU"$u0H.S=\E%7rV)7_bde7gigTZRUD_1kYGV*tn?D/JY:ev=)S\7tb6vfx4A+ozZ\πU"=lE#]=7aDOyWwBW2M$K)SXEQ#(zdOi3a6OH.2K+Zo+O%S$3a(fR&EO9xns4>pdgπU"AGJ5?TSbFm/pWZEaG4q5CgmO;gCGE)9t'e2KlY5b8k17_NN(S4bQOZsNi1l7^&gπU"dMCK-v%k3U$=iBlrn-=YKI2a#1Q=#OQDSp./h>c.:Q\1nXq;l;%q0fcZBdZ6O#-πU"MCCV/RR)9)B<I06sT$VX5*4-G2KCYY?bhjDGh$ZA\tD7Tu.18bl#E#).ET)SxbKπU"5]g7,7_T-H+l]IeMPSCEWNDDmlFy6Ym#Vu9H/cAY^Z/A=WGh4lVuv2j#,mwK,QpπU"$i_68LmINv\CP.c4W_KwFf>+LLEc/^<cF*dw]oE4&I_(20St3#)hJ)Cq_1'+LM;πEND SUBπSUB V3πU"hUk6X39822g^*t5\SO:XjhHQsV>E3HSaKrb/5pW#72z(CcQRr0QX;Tg<(DuRUn\πU"OKU/Z1MjiQi7r1s7]1RkwS\ld=3VURV8\x;iL:0l/DlS)Z'Matov445;EZkZ2/#πU"Vh?B[Mp$qapT4fI_9AA5XHi'oBYemQ9WE:dBEI9mY*mY]D9#XNiC_+ql04JTdrIπU"5u.SF(nls0X9ZO1\(qcyda?k9W7E4'%liUJw+_\#Ecg4aHr,&)90L]rTH(7?(n<πU"Daoi#y#w2>1>>Wbq,LHfFW-c]c1w'\W+>N/o=i79n5q]w0+SOJf.3//7s?:'8ZWπU"Uw:d.mgZ#/pXgmZ\,,5=aiHNYJ1Q'I5p3<V9RE>p_,7hK>.=r\b1TFw46<E*#-jπU"NRdlJ,?&e)Yi%rpUltT4am&UN:d;P2?LC(iNGm:^6P9Yu$>'fvYKJk+wYV\#WwRπU"Q9#yO6PvANvLR+d&C2/dEx&dfeVM=e#b6,Y3w[dMmiH58I6AT?'\b\>Dx2Vr_t9πU":1g7/lI1nu+_4zz?PnsH?N(=Py)B>8SuX0p6aeU'i#499Q2M+,Uco\/*7DH]CdzπU"dzD10IkD.*p->1\I.?W6=4.=f-I]M-Mrp:exeWl:Rr$h$nwKC>[$R2-zq-R+c9ZπU"jDm[a[p;>;>.br4rkK(J4ZHF[s_Hx2qLuGxb?X<qiif=(uPsKfnFOieAf)>O0q+πU"g*8\b]]c%4i,ak1MemEH?9%)Qh[fJFuE+n0i./zZy-N.WZ'qg:rKj%q.3&9(jCVπU"%6Tdf8c3C$%k&D>%o%NO9\3(te_3'h=.[EMRs>J5)cCvXa6i*&BGA+a6Fv/+C*KπU"EhN]hqPL3M(+:=4)B[,D'q&nnm;*\$.=?bXYgntp::jvli=Zn/(A\A$VTjL2*RuπU".0f)FL-l&0H5IAitcSDOhPP0-xoZL33,9^S2M'kVrRHSSCrP)a]-2tb]Am5ZB\LπU"4Fmg1T7kx9bztf8bQ>;jjgx#]Jq7g-Jw\dsguWXq^1q(>_k*5BNQT?2s7pPa48)πU"B7#^L_+HGKvo22NGet^Wnp(o>zhsP\e)*?i)qn^s;7cN7>nC$]jrCpUyGiD_:G4πU"UbP?JQk;]pIDG[m,y,wRB3noAvGseTT3I:+jN[9;&UpVBH%rOYW$.mY5HHi)$7*πU"7sr3U8_OqhedXAnA?4,Xxr*/2<82EOg%RMH(BNA6;P&;TY#6]uhiNTn9,S:ZpCJπU"OT^m2-D;I.GV,.z=R*Rw)^m_1a1G*&=5\lTGk?=NU3EJ/'Gr(VzcH1KQl1JnG%;πU"IcWy=;uxi,l\kW9Czg&O*,$7h_4G>BM'L3*SD>QyhzOXq-e+k;NdfYASXm]EgK2πU"URTp0Sa*n9K0%Z'/D3+EGZecdMYaVU9=NeQm34KAx2p:f]B3l9hqYb[>A=3F\N.πU"8Ep>hk<5)Ok5q_qsJG)AxV)7)[W%3:xKcVbm*USbCA9<Zd2wLHTPY*hvILmi<bnπU"pF6gCAuj#GFXDE-*PAnV_I<%498c8u*YwvV+VR0fpQL\^JM'c#^gQ+IHH#eduebπU"tRW)/wSdWwygUoYsp??<gftq6rjidL=-nJ)zyykA&q4DDa;P5_h+2Z96v(PI<[IπU"?qBTcpHOG'Cq^M%eC4^vUaf$0t6OUh,RY1:91Vs)QO3C3n>Mf&&X*SqlnRJ'pGXπU"I)iZTPw=f\4_Nlgl1UXJhwLztcQ,r=sKfKn3Zc5X3sufB(+r%&+%U:D'=T,y8wGπU"55]xL)\iRu:15FR]&B(Q;ij(k%]0DlJv/QpO>SCC[^pL$WmRmM[FsojVeR^Y<4bπU">U.g#s\Gvh9gXheg+f691ecN8rKna$*2('MTiH]]C?1Ev+)Nxf33ii0\N-yA^K#πU"$TTq9DFssgf#K\--w;R\BioGQX&O5jYgwEA%sF/9,o6/GBcvU:;.n3mb2Lu7i]%πU"C$&HY?Wg9aK$ovO*gjzVffCOd+/#n&=l(=VC&p'f,IT>8'[<t>ManqxI+lTq^fEπU"D_iB1pP8-ACNsym4Re.&*h\GQZ.KA=L[tgm\t-<xL.#uN0_&F^Ah(<Ow;]EMCR1πU"WD;^e(Q5Ji)eW'DAb0:^2.s\oGWJ#8/=BbE2_hTP5ijzs=FLS3/\6Su%E>TRd[:πU"-kS&WDrG:nZP2n)xoatcU'^yYl(_u//'kW,P(y3u&DDb)=tm+c=YvtQWuu-1b7QπU"QAW5I[w^mX=N5NsC)1o(T]LhB$K(KHq'ao]Mux%%up&%'9%9%%%%-g%3n]RAY(0πU"+]N2%+%[H%%%/%%%%%%%%%&%E%%%%%%%%%w%jfir#jSy'%yup&%'9%9%%%%-j%&πU"m]jA1H.*Q:l%7%Zl%%%0%%%%%%%%%&%E[%%%v%2%%r%fuun%slSg%fxup%*+%%%πU"%%'%.'%#%.%%$z%%%%%πEND SUBπV2πV3πCLOSE:IF S=249AND B&=Z&THEN?" :) Ok!"ELSE?" :( Bad!πSUB U(A$):FOR A=1TO LEN(A$):C=ASC(MID$(A$,A))-37:IF C<0THEN C=91+C*32πIF K<4THEN K=C+243ELSE?#1,CHR$(C+(K MOD 3)*86);:K=K\3:B&=B&+1πS=(S+C)AND 255:NEXT:LOCATE,1:?STRING$(B&*50\Z&,219);:END SUBπRobin Ohm                      PICTURE PUZZLE                 rkohm@euronet.nl               09-28-96 (16:05)       QB, QBasic, PDS        280  8341     PUZZLE.BAS  REM **********************************************πREM             More Qbasic Software:πREM       http://www.euronet.nl/users/rkohm/πREM          Any questions? E-mail to:πREM              rkohm@euronet.nlπREM **********************************************ππDECLARE SUB swapbox (which!)πDECLARE SUB check ()πDECLARE SUB game ()πDECLARE SUB move (whereto!)πDECLARE SUB fieldsetup ()πDECLARE SUB background ()ππCOMMON SHARED x, y, xcoor, ycoor, xold, yold, loca, sound$ππCLS : SCREEN 12πxcoor = 363: ycoor = 163: loca = 1ππON KEY(10) GOSUB endofgameπKEY(10) ONππDIM SHARED square1(200), square2(200), square3(200), square4(200)πDIM SHARED square5(200), square6(200), square7(200), square8(200)πDIM SHARED square9(200), square10(200), square11(200), square12(200)πDIM SHARED square13(200), square14(200), square15(200), square16(200)πDIM SHARED box(16), theone(200)ππRANDOMIZE TIMERπFOR temp = 1 TO 16πagain:π DO: place = FIX(RND * 16 + 1): LOOP UNTIL 1 <= place <= 16π IF box(place) <> 0 THEN GOTO againπ box(place) = tempπNEXTππ'FOR sed = 1 TO 16π' box(sed) = sedπ'NEXTπ'box(5) = 1: box(1) = 5ππbackgroundπfieldsetupππDOπ gameπ checkπLOOPπππENDππendofgame:πENDππSUB backgroundπLOCATE 10, 23: PRINT "Select a background for the puzzle: (1-3)"πLOCATE 11, 28: PRINT "1. House"πLOCATE 12, 28: PRINT "2. Boat"πLOCATE 13, 28: PRINT "3. Car"πDO: user$ = INKEY$: LOOP UNTIL user$ = "1" OR user$ = "2" OR user$ = "3"πCLSπDRAW "bm280,330u176l176d176r176bh8u160l160d160r160bfp15,15h"  'square 1ππSELECT CASE user$πCASE "1"π DRAW "bl45bu10p9,15c14u70l100d70r100bhp14,14fu70c4h50g50r100h4blp4,4rh10c6u40l20d20"π DRAW "f20u4blp6,6rbg70bd16c1u40r30d40l30bep1,1gbe20br25c2u30r30d30l30bep2,2g"π DRAW "br83l43d23l102u23l13d31r158u31bgp2,2"π CIRCLE (245, 200), 20, 14: PAINT (245, 200), 14, 14   'houseπCASE "2"π DRAW "bhp9,15c1u30l160d30r160bhp1,1f2"π DRAW "bl55c14be15e35l150f35r80bhp14,14fl15u36c6u90l10d90r10bhp6,6fu10c8r50"π LINE STEP(0, 0)-(218, 190), 8: DRAW "d70bep8,8": LINE (206, 190)-(120, 262), 8π DRAW "r86u70d5blp8,8ru5bd100br15": CIRCLE STEP(0, 0), 5, 2: DRAW "p2,2bl30"π CIRCLE STEP(0, 0), 5, 2: DRAW "p2,2bl30": CIRCLE STEP(0, 0), 5, 2: DRAW "p2,2"π CIRCLE (250, 190), 15, 14: PAINT STEP(0, 0), 14, 14   'boatπCASE "3"π DRAW "bhp9,15c2u35l160d35r160bhp2,2": CIRCLE (160, 280), 18, 8: DRAW "p8,8"π CIRCLE (225, 280), 18, 8: DRAW "p8,8": CIRCLE (160, 280), 8, 7: DRAW "p7,7"π CIRCLE (225, 280), 8, 7: DRAW "p7,7"π DRAW "bm267,320c12bh40r35u30l30h20l40g20l30d30r140bh30bl5"π DRAW "p12,12c8h15l20d15r35l2bup8,8dbl38u15l10g15r25bhp8,8fc0bu21br10h35bh"π CIRCLE STEP(0, 0), 2, 0: DRAW "p0,0": CIRCLE (230, 190), 15, 14: DRAW "p14,14"πEND SELECTππDRAW "bm112,162c15r160d160l160u160r40d160r40u160r40d160r40u40l160u40r160u40l160"ππDRAW "bm530,330u176l176d176r176bh8u160l160d160r160bfp15,15h"  'square 2πDRAW "bm362,162c15r160d160l160u160r40d160r40u160r40d160r40u40l160u40r160u40l160"πππDRAW "bm133,183p0,15"'bm1,1p4,15"πGET (113, 163)-(151, 201), square1πGET (153, 163)-(191, 201), square2πGET (193, 163)-(231, 201), square3πGET (233, 163)-(271, 201), square4πGET (113, 203)-(151, 241), square5πGET (153, 203)-(191, 241), square6πGET (193, 203)-(231, 241), square7πGET (233, 203)-(271, 241), square8πGET (113, 243)-(151, 281), square9πGET (153, 243)-(191, 281), square10πGET (193, 243)-(231, 281), square11πGET (233, 243)-(271, 281), square12πGET (113, 283)-(151, 321), square13πGET (153, 283)-(191, 321), square14πGET (193, 283)-(231, 321), square15πGET (233, 283)-(271, 321), square16ππLOCATE 2, 5: COLOR 14: PRINT "F10"; : COLOR 15: PRINT " Exit"πLOCATE 3, 5: COLOR 14: PRINT "(Arrow keys on the Number Pad)";πCOLOR 15: PRINT " Move Red Box"πLOCATE 4, 5: COLOR 14: PRINT "Enter"; : COLOR 15: PRINT " Move a piece to the empty place."ππLOCATE 23, 5: PRINT "Move the pieces until you have completed the puzzle. You can only move"πLOCATE 24, 5: PRINT "pieces to the empty (black) place. "πEND SUBππSUB checkπFOR rgt = 1 TO 16π IF box(rgt) <> rgt THEN EXIT SUBπNEXTπCOLOR 14: LOCATE 26, 5: PRINT "Congratulations!! You have completed the puzzle!!"πCOLOR 4: ENDπEND SUBππSUB fieldsetupπFOR temp = 1 TO 16πmove tempπSELECT CASE box(temp)π CASE 1: PUT (x, y), square1, PSETπ CASE 2: PUT (x, y), square2, PSETπ CASE 3: PUT (x, y), square3, PSETπ CASE 4: PUT (x, y), square4, PSETπ CASE 5: PUT (x, y), square5, PSETπ CASE 6: PUT (x, y), square6, PSETπ CASE 7: PUT (x, y), square7, PSETπ CASE 8: PUT (x, y), square8, PSETπ CASE 9: PUT (x, y), square9, PSETπ CASE 10: PUT (x, y), square10, PSETπ CASE 11: PUT (x, y), square11, PSETπ CASE 12: PUT (x, y), square12, PSETπ CASE 13: PUT (x, y), square13, PSETπ CASE 14: PUT (x, y), square14, PSETπ CASE 15: PUT (x, y), square15, PSETπ CASE 16: PUT (x, y), square16, PSETπEND SELECTπNEXTπEND SUBππSUB gameπxold = xcoor: yold = ycoorπLINE (xcoor - 1, ycoor - 1)-(xcoor + 39, ycoor + 39), 4, BπDO: userinput$ = INKEY$: LOOP UNTIL userinput$ <> ""πSELECT CASE userinput$πCASE "8"π IF ycoor > 163 THENπ  ycoor = ycoor - 40π  loca = loca - 4π  sound$ = "no"π END IFπCASE "6"π  IF xcoor < 483 THENπ   xcoor = xcoor + 40π   loca = loca + 1π   sound$ = "no"π  END IFπCASE "2"π IF ycoor < 283 THENπ  ycoor = ycoor + 40π  loca = loca + 4π  sound$ = "no"π END IFπCASE "4"π IF xcoor > 363 THENπ  xcoor = xcoor - 40π  loca = loca - 1π  sound$ = "no"π END IFπCASE CHR$(13)π SELECT CASE locaπ  CASE 1π   IF box(loca + 1) = 1 THEN swapbox 1π   IF box(loca + 4) = 1 THEN swapbox 4π  CASE 2, 3π   IF box(loca - 1) = 1 THEN swapbox -1π   IF box(loca + 1) = 1 THEN swapbox 1π   IF box(loca + 4) = 1 THEN swapbox 4π  CASE 4π   IF box(loca - 1) = 1 THEN swapbox -1π   IF box(loca + 4) = 1 THEN swapbox 4π  CASE 5, 9π   IF box(loca + 1) = 1 THEN swapbox 1π   IF box(loca - 4) = 1 THEN swapbox -4π   IF box(loca + 4) = 1 THEN swapbox 4π  CASE 6, 7, 10, 11π   IF box(loca - 1) = 1 THEN swapbox -1π   IF box(loca + 1) = 1 THEN swapbox 1π   IF box(loca - 4) = 1 THEN swapbox -4π   IF box(loca + 4) = 1 THEN swapbox 4π  CASE 8, 12π   IF box(loca - 1) = 1 THEN swapbox -1π   IF box(loca - 4) = 1 THEN swapbox -4π   IF box(loca + 4) = 1 THEN swapbox 4π  CASE 13π   IF box(loca + 1) = 1 THEN swapbox 1π   IF box(loca - 4) = 1 THEN swapbox -4π  CASE 14, 15π   IF box(loca - 1) = 1 THEN swapbox -1π   IF box(loca + 1) = 1 THEN swapbox 1π   IF box(loca - 4) = 1 THEN swapbox -4π  CASE 16π   IF box(loca - 1) = 1 THEN swapbox -1π   IF box(loca - 4) = 1 THEN swapbox -4π END SELECTπEND SELECTπIF sound$ = "" THEN PLAY "L30GC"πsound$ = ""πLINE (xold - 1, yold - 1)-(xold + 39, yold + 39), 15, BπLINE (xcoor - 1, ycoor - 1)-(xcoor + 39, ycoor + 39), 4, BπEND SUBππSUB move (whereto)πSELECT CASE wheretoπ CASE 1: x = 363: y = 163π CASE 2: x = 403: y = 163π CASE 3: x = 443: y = 163π CASE 4: x = 483: y = 163π CASE 5: x = 363: y = 203π CASE 6: x = 403: y = 203π CASE 7: x = 443: y = 203π CASE 8: x = 483: y = 203π CASE 9: x = 363: y = 243π CASE 10: x = 403: y = 243π CASE 11: x = 443: y = 243π CASE 12: x = 483: y = 243π CASE 13: x = 363: y = 283π CASE 14: x = 403: y = 283π CASE 15: x = 443: y = 283π CASE 16: x = 483: y = 283πEND SELECTπEND SUBππSUB swapbox (which)πsound$ = "no"πSELECT CASE whichπ CASE -1: box(loca - 1) = box(loca): box(loca) = 1π CASE 4: box(loca + 4) = box(loca): box(loca) = 1π CASE 1: box(loca + 1) = box(loca): box(loca) = 1π CASE -4: box(loca - 4) = box(loca): box(loca) = 1πEND SELECTππDOπIF times = 0 THEN variable = loca + whichπIF times = 1 THEN variable = locaππmove variableπSELECT CASE box(variable)π CASE 1: PUT (x, y), square1, PSETπ CASE 2: PUT (x, y), square2, PSETπ CASE 3: PUT (x, y), square3, PSETπ CASE 4: PUT (x, y), square4, PSETπ CASE 5: PUT (x, y), square5, PSETπ CASE 6: PUT (x, y), square6, PSETπ CASE 7: PUT (x, y), square7, PSETπ CASE 8: PUT (x, y), square8, PSETπ CASE 9: PUT (x, y), square9, PSETπ CASE 10: PUT (x, y), square10, PSETπ CASE 11: PUT (x, y), square11, PSETπ CASE 12: PUT (x, y), square12, PSETπ CASE 13: PUT (x, y), square13, PSETπ CASE 14: PUT (x, y), square14, PSETπ CASE 15: PUT (x, y), square15, PSETπ CASE 16: PUT (x, y), square16, PSETπEND SELECTπtimes = times + 1πLOOP UNTIL times = 2πtimes = 0πEND SUBπBrennen Bearnes                QBASIC ROCKWARS                bbearnes@worldnet.att.net      10-05-96 (15:14)       QB, QBasic, PDS        473  13252    ROCKWARS.BAS'QBasic Rockwars, by Brennen Bearnesπ'You play the part of the blue castle.  You've been attacked byπ'the red castle, who has started sending robotic tanks equipped withπ'a short range death ray at you.  Fortunately, you've been hard at workπ'on your own secret weapon, a powerful catapult that can launch rocksπ'all the way to the other side of the screen.ππ'How to play:π'A tank will start coming at you as soon as the game begins.  If theπ'red castle is fairly close, then you should shoot the tank first.π'Every time you blow up a tank, the red castle sends another one,π'so sooner or later, you'll have to hit the castle.  To fire, pressπ'F1, and type in the angle (10-180) and velocity (0-100) you want.  Beπ'sure to take the wind into account.  If the tank gets close enough,π'then you're toast.ππ'Brent P. Newhall did all the code for the explosions, as well as the starπ'field, and a number of other small but effective changes.π'The little moon orbiting a planet in the background was doneπ'by Marco Koegler (and thanks to everyone else that told me how to do it).π'I figured out how to plot the projectiles from GORILLA.BAS, which Iπ'found on an old computer at school.ππ'Suggestions are welcome, and if you improve this in any way, pleaseπ'send me a copy.π'bbearnes@worldnet.att.netπ'http://www.geocities.com/SiliconValley/Park/8994/ππ' Brent P. Newhall edited 9/30/96π' Notes: The explode code now restores the screen to how it looked priorπ'        to the explosion.  I then added code to erase the bullet andπ'        exploded item just after the explosion.  I also added the stars.π'        Before, you could enter an angle of zero and just wipe outπ'        anything before you.  Now the angle can be no less than 10.π'        I've also cleaned up the code a bit, making it more readable,π'        less time- and memory-intensive, etc.ππDECLARE SUB newTank ()πDECLARE SUB drawTank ()πDECLARE SUB newRock ()πDECLARE SUB drawRock ()πDECLARE SUB explode (green%, blue%, red%, boomX, boomY, boomSize)ππCONST pi = 3.141592654#ππTYPE arctypeπ  Radius AS INTEGERπ  colr AS INTEGERπ  p1 AS SINGLEπ  p2 AS SINGLEπEND TYPEππ'Variables that control the rockπDIM SHARED rockAngleπDIM SHARED rockSpeedπDIM SHARED startRockXπDIM SHARED startRockYπDIM SHARED oldRockXπDIM SHARED oldRockYπDIM SHARED rock1existπDIM SHARED t 'timeπDIM SHARED rockXπDIM SHARED rockYπDIM SHARED startRockXvelπDIM SHARED startRockYvelπDIM SHARED gravityπDIM SHARED windππ'The castles and tank.πDIM SHARED castle2XπDIM SHARED castleXπDIM SHARED tankExistπDIM SHARED TankXπDIM SHARED oldTankXπDIM SHARED tankSpeedπDIM SHARED castleExistπDIM SHARED castle2ExistππDIM SHARED x1 AS INTEGER, y1 AS INTEGER, x2 AS INTEGER, y2 AS INTEGERπDIM SHARED ExplodeHold(1 TO 10000)  AS INTEGERππcastleExist = 1πcastle2Exist = 1ππSCREEN 13π        π'GET the player's castle.πDIM SHARED castle%(15, 15)πLINE (5, 5)-(20, 20), 1, BFπLINE (8, 5)-(10, 7), 0, BFπLINE (12, 5)-(14, 7), 0, BFπLINE (16, 5)-(18, 7), 0, BFπLINE (10, 15)-(15, 20), 0, BFπGET (5, 5)-(20, 20), castle%πCLSππ'GET the computer's castle.πDIM SHARED castle2%(15, 15)πLINE (5, 5)-(20, 20), 4, BFπLINE (8, 5)-(10, 7), 0, BFπLINE (12, 5)-(14, 7), 0, BFπLINE (16, 5)-(18, 7), 0, BFπLINE (10, 15)-(15, 20), 0, BFπGET (5, 5)-(20, 20), castle2%πCLSππ'GET the tankπDIM SHARED tank%(11, 8)πLINE (2, 4)-(10, 6), 2, BFπLINE (5, 1)-(8, 4), 2, BFπLINE (1, 2)-(5, 2), 2πCIRCLE (3, 6), 2, 2πCIRCLE (8, 6), 2, 2πGET (1, 1)-(11, 8), tank%πCLSππ'The tank firing.πDIM SHARED tank2%(11, 8)πLINE (2, 4)-(10, 6), 2, BFπLINE (5, 1)-(8, 4), 2, BFπLINE (1, 1)-(5, 3), 2πCIRCLE (3, 6), 2, 2πCIRCLE (8, 6), 2, 2πGET (1, 1)-(11, 8), tank2%πCLSππ'The center of the planetπplanetX = 180: planetY = 45π'Draw the planetπFOR circ% = 1 TO 8π CIRCLE (planetX, planetY), circ%, 9π CIRCLE (planetX, planetY + 1), circ%, 9πNEXT circ%πLINE (planetX - 8, planetY)-(planetX + 8, planetY), 4πLINE (planetX - 8, planetY - 2)-(planetX + 8, planetY - 2), 12πLINE (planetX - 7, planetY - 3)-(planetX + 7, planetY - 3), 12πLINE (planetX - 5, planetY - 5)-(planetX + 5, planetY - 5), 4πLINE (planetX - 8, planetY + 3)-(planetX + 8, planetY + 3), 4πLINE (planetX - 6, planetY + 5)-(planetX + 6, planetY + 5), 4πCIRCLE (planetX + 2, planetY + 4), 2, 4πCIRCLE (planetX + 2, planetY + 4), 1, 4πCIRCLE (planetX + 3, planetY + 4), 1, 4ππ'Draw the groundπLINE (0, 175)-(320, 175), 10πPAINT (0, 176), 10, 1ππ'PUT the castlesπcastleX = 15πPUT (castleX, 159), castle%πRANDOMIZE TIMERπcastle2X = INT(RND * 175) + 175πIF castle2X >= 285 THEN castle2X = 285πPUT (castle2X, 159), castle2%ππ'The code to make the moon "orbit" the planet was done by Marco KoeglerπorbitRadius = 30 'Radius of the orbitπmoonAngle = 0 'Initialize the moons angleπoldMoonX = planetX + 75: oldMoonY = planetYππgravity = 9.8ππ'Display starsπFOR cnt% = 1 TO 75π  PSET (INT(RND * 319), INT(RND * 120) + 30), INT(RND * 15 + 15)πNEXT cnt%ππDOπ  moonAngle = moonAngle + .5π  IF moonAngle = 360 THEN moonAngle = 0π  theta = moonAngle * (pi / 180)π  moonX = planetX + orbitRadius * (COS(theta))π  moonY = planetY - orbitRadius * (SIN(theta))π π  'Erase old moonπ  CIRCLE (oldMoonX, oldMoonY), 2, 0π  π  'Draw new moonπ  CIRCLE (moonX, moonY), 2, 8π  oldMoonX = moonX: oldMoonY = moonYππ  ptime! = TIMER: WHILE ptime! = TIMER: WEND ' Pauseππ  K$ = INKEY$π  IF LEN(K$) = 2 THENπ    SELECT CASE ASC(RIGHT$(K$, 1))π    CASE 59 'F1π      IF rock1exist = 0 THENπ        newRockπ      END IFπ    END SELECTπ  ELSEIF LEN(K$) = 1 THENπ    SELECT CASE ASC(K$)π      CASE 27: quit = 1π    END SELECTπ  END IFπ π  IF rock1exist = 1 THENπ    drawRockπ  END IFππ  IF tankExist = 0 AND castle2Exist = 1 THENπ    newTankπ  ELSEIF tankExist = 1 THENπ    drawTankπ  END IFππ  IF castleExist = 0 THENπ    '"Melt" the screen and end the game if the player loses.π    quit = 2π  ELSEIF castle2Exist = 0 AND tankExist = 0 THENπ    'If the red castle and tank are both blown up, then end the game.π    quit = 3π  END IFππLOOP UNTIL quit > 0ππIF quit = 2 THENπ  '"Melt" the screen and end the game if the player loses.π  LOCATE 8, 15: PRINT "you lose"π  LOCATE 9, 14: PRINT "the end"π  SLEEP 1π  DIM melt%(3000)π  FOR RR = 1 TO 3000π    RANDOMIZE TIMERπ    XX = INT(RND * 271)π    RANDOMIZE TIMERπ    YX = INT(RND * 150)π    GET (XX, YX)-(XX + 48, YX + 48), melt%π    PUT (XX, YX + 1), melt%, PSETπ    IF INKEY$ = CHR$(27) THEN ENDπ  NEXT RRπELSEIF quit = 3 THENπ  'If the red castle and tank are both blown up, then end the game.π  LOCATE 15, 15: PRINT "you win"πEND IFππENDππSUB drawRockππoldRockX = rockXπoldRockY = rockYππ'Calculate the next position of the rockπrockX = startRockX + (startRockXvel * t) + (.5 * (wind / 5) * t ^ 2)πrockY = startRockY + ((-1 * (startRockYvel * t)) + (.5 * gravity * t ^ 2)) * (200 / 350)ππIF rockY >= 174 THENπ  'Do an explosion when the rock hits the "ground".π  rock1exist = 0π  green% = 20π  blue% = 0π  boomX = rockXπ  boomY = rockYπ  boomSize = 6π  explode green%, blue%, red%, boomX, boomY, boomSizeπ  CIRCLE (oldRockX, oldRockY), 1, 0 ' Erase rockπELSEIF rockY >= 159 AND rockX >= castle2X AND rockX <= castle2X + 15 THENπ  'Do an explosion when the rock hits the enemy castle.π  IF castle2Exist = 1 THENπ    rock1exist = 0π    castle2Exist = 0π    green% = 0π    blue% = 0π    boomX = rockXπ    boomY = rockYπ    boomSize = 50π    explode green%, blue%, red%, boomX, boomY, boomSizeπ    CIRCLE (oldRockX, oldRockY), 1, 0 ' Erase rockπ    PUT (castle2X, 159), castle2% ' Erase enemy castleπ  END IFπELSEIF rockY >= 167 AND rockX >= TankX AND rockX <= TankX + 10 THENπ  'Do an explosion if rock hits the tank.π  tankExist = 0π  rock1exist = 0π  green% = 20π  blue% = 0π  boomX = TankXπ  boomY = rockYπ  boomSize = 30π  explode green%, blue%, red%, boomX, boomY, boomSizeπ  CIRCLE (oldRockX, oldRockY), 1, 0 ' Erase rockπ  PUT (INT(TankX), 167), tank%, XOR ' Erase tankπEND IFππIF rockX >= 319 OR rockX <= 1 THENπ rock1exist = 0π CIRCLE (oldRockX, oldRockY), 1, 0πEND IFππIF rock1exist = 1 THENπ CIRCLE (oldRockX, oldRockY), 1, 0π CIRCLE (rockX, rockY), 1, 12πELSEIF rock1exist = 0 THENπ rockX = 0π rockY = 0πEND IFππt = t + .1ππEND SUBππSUB drawTankππ'Move the tank, or if the tank is close enough, blow up the player'sπ'castle.πtankSpeed = .5πIF TankX > castleX + 60 THENπ  'Make the tank try to avoid the rocks (doesn't work very well, but canπ  'make the game a little more challenging).π  IF TankX - rockX < 20 AND TankX - rockX > -1 THENπ    tankSpeed = -.8π  END IFπ  oldTankX = TankXπ  TankX = TankX - tankSpeedπELSEIF TankX <= castleX + 60 THENπ  PUT (INT(TankX), 167), tank2%, PSETπ  SLEEP 1π  PALETTE 95, 60π  LINE (INT(TankX) - 2, 167)-(castleX + 15, 162), 95π  FOR cnt% = 1 TO 30π    PALETTE 95, INT(RND * 30 + 30)π    ptime! = TIMER: WHILE ptime! = TIMER: WEND ' Pauseπ  NEXT cnt%π  PALETTE 95, 0π  tankExist = 0π  green% = 0π  blue% = 30π  boomX = castleX + 15π  boomY = 162π  boomSize = 50π  explode green%, blue%, red%, boomX, boomY, boomSizeπ  castleExist = 0πEND IFππPUT (INT(oldTankX), 167), tank%, XORπPUT (INT(TankX), 167), tank%, PSETππEND SUBππSUB explode (green%, blue%, red%, boomX, boomY, boomSize)ππ'This code started as EXPLODE.BAS by Brent P. Newhall.  I've only made aπ'few minor changes.  The comments are all his.ππ''I was thinking about that "I need fire and an exploding graphic" postπ''and came up with this simple explosion program.  Any suggestions,π''comments, etc. are welcome with open arms.ππ''NOTES: There are two lines that do not wrap properly; you'll be able toπ''find them easily.  Also, NumArcs is set to 100, which does anπ''acceptable explosion on my 486DX2/50 with 8 megs of RAM.  You Pentiumπ''people should be able to get a much nicer explosion if you set NumArcsπ''equal to 1000 or so.ππ''The program sets colors 100 to 131 to varying shades of red, orange,π''and yellow for the explosive effect, with the nice side-effect thatπ'you can theoretically do several explosions at once.ππNumArcs = 65πDIM arc(1 TO NumArcs) AS arctypeπRANDOMIZE TIMERπFOR cnt% = 1 TO NumArcs ' Initialiseπ  arc(cnt%).Radius = 0π  arc(cnt%).p1 = RND * 5.8π  arc(cnt%).p2 = arc(cnt%).p1 + (RND / 2)π  arc(cnt%).colr = INT(RND * 5 + 100)πNEXT cnt%πred% = 63 ' Start it deep redπFOR cnt% = 100 TO 130 ' Change colorsπ  PALETTE cnt%, red% + 256 * green% + 65536 * blue%π  IF cnt% <= 114 THEN ' Lower red, increase yellowπ    red% = red% - 2π    green% = green% + 2π  ELSE ' Lower red and yellowπ    red% = red% - 2π    green% = green% - 2π  END IFπNEXT cnt%πPALETTE 131, 0πTimeCnt% = 0πx1 = boomX - boomSizeπIF x1 < 0 THEN x1 = 0πy1 = boomY - boomSizeπIF y1 < 0 THEN y1 = 0πx2 = boomX + boomSizeπIF x2 > 319 THEN x2 = 319πy2 = boomY + boomSizeπIF y2 > 199 THEN y2 = 199πGET (x1, y1)-(x2, y2), ExplodeHold(1)πDOπ  TimeCnt% = TimeCnt% + 1π  FOR CurrArc% = 1 TO NumArcsπ    IF arc(CurrArc%).Radius > 4 THEN ' Erase previous arcπ      CIRCLE (boomX, boomY), arc(CurrArc%).Radius - 5, 0, arc(CurrArc%).p1, arc(CurrArc%).p2π    END IFπ    IF arc(CurrArc%).Radius = 0 THEN ' Not yet aliveπ      ' About 30% of the time, create a new arcπ      IF RND > .7 THEN arc(CurrArc%).Radius = 1π    ELSEIF arc(CurrArc%).colr = 131 THEN ' Deadπ      REM Do Nothingπ    ELSEπ      arc(CurrArc%).Radius = arc(CurrArc%).Radius + 1 ' Increase radiusπ      arc(CurrArc%).colr = arc(CurrArc%).colr + 1 ' Increase colorπ      ' Draw arcπ      CIRCLE (boomX, boomY), arc(CurrArc%).Radius, arc(CurrArc%).colr, arc(CurrArc%).p1, arc(CurrArc%).p2π    END IFπ  NEXT CurrArc%π  t! = TIMER: WHILE t! = TIMER: WEND ' Pauseπ  IF TimeCnt% >= boomSize THEN quitExplode = 1πLOOP UNTIL quitExplode > 0πPUT (x1, y1), ExplodeHold(1), PSETππEND SUBππSUB newRockππ'initialize the wind, and tell the player.πRANDOMIZE TIMER: windirec = RND * 2:πLOCATE 1, 1: PRINT SPC(30);πIF windirec <= 1 THENπ RANDOMIZE TIMER: wind = RND * -10π LOCATE 1, 1: PRINT "wind: "; wind; "<-"πELSEIF windirec > 1 THENπ RANDOMIZE TIMER: wind = RND * 10π LOCATE 1, 1: PRINT "wind:"; wind; "-> "πEND IFπππ'Get player input for angle and velocity, and initialize the rock.π'Velocity can range from 0 to 100, and angle can be inbetween 10 and 180.ππLOCATE 2, 1: PRINT "Angle:   "πDOπ  LOCATE 2, 7: PRINT "    ";π  LOCATE 2, 7: INPUT "", rockAngleπLOOP UNTIL rockAngle >= 10 AND rockAngle <= 180πLOCATE 3, 1: PRINT "Velocity:   "πDOπ  LOCATE 3, 10: PRINT "    ";π  LOCATE 3, 10: INPUT "", rockSpeedπLOOP UNTIL rockSpeed >= 0 AND rockSpeed <= 100π    πLINE (1, 1)-(50, 50), 0πstartRockX = castleX + 6πstartRockY = 157πoldRockX = startRockXπoldRockY = startRockYπrock1exist = 1ππrockAngle = rockAngle / 180 * piπstartRockXvel = COS(rockAngle) * rockSpeedπstartRockYvel = SIN(rockAngle) * rockSpeedππt = 0ππdrawRockππEND SUBππSUB newTankππ'Initialize tank.πtankExist = 1πTankX = castle2X - 12πoldTankX = castle2X - 12ππPUT (castle2X, 159), castle2%, PSETππdrawTankππEND SUBπBrian Flanagan                 STICK FIGHTER                  Brianster@aol.com              10-14-96 (09:09)       QB, QBasic, PDS        492  21159    QBFIGHT.BAS ' This is a quick beta for a fighter-type ( i.e. mortal kombat ) QBasic game.π' I looked for a good fighter game written in QBasic, but most the ones thatπ' I found were pretty lame - mostly tiny graphics with very little feel forπ' player movement, which I think is what really makes these type of gamesπ' fun.  Anyway, there is still plenty of work left to do here, but seeingπ' how several programmers jumped on Peter Cooper's raycasting engine, Iπ' figured that I might bounce it here and get some feed-back.  Feel free toπ' do with this what you will, and I would appreciate any improvements to theπ' code sent to me.π'π' Brianster@aol.comπ' :-)π'π' BTW, some of these lines may wrap once posted to the newsgroup, so youπ' might have to edit the code a little bit before it runs...π'ππTYPE playerdataπ   xpos AS INTEGERπ   ypos AS INTEGERπ   frame AS INTEGERπ   mframe AS INTEGERπ   tframe AS INTEGERπ   strength AS INTEGERπEND TYPEππDIM player(2) AS playerdataππTYPE PointTypeπ   xpos AS INTEGERπ   ypos AS INTEGERπEND TYPEππTYPE splatdataπ   xpos AS INTEGERπ   ypos AS INTEGERπ   frame AS INTEGERπEND TYPEππDIM splat AS splatdataππmaxmoves% = 9ππDIM rs(maxmoves%) AS PointTypeπDIM ls(maxmoves%) AS PointTypeπDIM re(maxmoves%) AS PointTypeπDIM le(maxmoves%) AS PointTypeπDIM rh(maxmoves%) AS PointTypeπDIM lh(maxmoves%) AS PointTypeπDIM rw(maxmoves%) AS PointTypeπDIM lw(maxmoves%) AS PointTypeπDIM rk(maxmoves%) AS PointTypeπDIM lk(maxmoves%) AS PointTypeπDIM ra(maxmoves%) AS PointTypeπDIM la(maxmoves%) AS PointTypeπDIM rt(maxmoves%) AS PointTypeπDIM lt(maxmoves%) AS PointTypeππFOR i% = 1 TO maxmoves%π   READ rh(i%).xpos, rh(i%).ypos, lh(i%).xpos, lh(i%).yposπ   READ re(i%).xpos, re(i%).ypos, le(i%).xpos, le(i%).yposπ   READ rs(i%).xpos, rs(i%).ypos, ls(i%).xpos, ls(i%).yposπ   READ rw(i%).xpos, rw(i%).ypos, lw(i%).xpos, lw(i%).yposπ   READ rk(i%).xpos, rk(i%).ypos, lk(i%).xpos, lk(i%).yposπ   READ ra(i%).xpos, ra(i%).ypos, la(i%).xpos, la(i%).yposπ   READ rt(i%).xpos, rt(i%).ypos, lt(i%).xpos, lt(i%).yposπNEXT i%ππ' Standing still.π' Frame 1.πDATA 14,88,24,79πDATA 12,109,16,102πDATA 1,81,1,81πDATA 0,119,0,119πDATA 20,148,5,148πDATA 31,178,-7,175πDATA 39,180,-2,184ππ' Punch.π' Frame 2.πDATA 19,85,33,86πDATA 12,108,17,103πDATA 1,80,1,80πDATA 0,119,0,119πDATA 21,147,6,147πDATA 31,178,-14,175πDATA 40,181,-9,183ππ' Frame 3.πDATA 26,81,49,77πDATA 11,110,29,89πDATA 5,79,5,79πDATA 0,120,0,120πDATA 23,148,-7,151πDATA 33,180,-36,175πDATA 44,183,-31,182ππ' Frame 4.πDATA 40,78,80,76πDATA 25,108,51,79πDATA 18,80,18,80πDATA 0,120,0,120πDATA 27,149,-6,151πDATA 36,181,-34,174πDATA 47,183,-29,183ππ' Kick.π' Frame 5.πDATA 26,79,16,87πDATA 20,104,13,110πDATA 2,80,2,80πDATA 0,124,0,124πDATA 19,153,-5,156πDATA 21,186,-20,186πDATA 31,189,-16,192ππ' Frame 6.πDATA 2,82,14,79πDATA -5,106,11,102πDATA -1,73,-1,73πDATA 0,114,0,114πDATA 19,143,31,127πDATA 22,176,16,158πDATA 32,177,22,165ππ' Frame 7.πDATA -14,98,10,76πDATA -27,112,8,99πDATA -11,78,-11,78πDATA 0,119,0,119πDATA 5,149,38,117πDATA 8,183,9,138πDATA 15,181,8,149ππ' Frame 8.πDATA -13,97,11,68πDATA -24,117,8,90πDATA -13,86,-13,86πDATA 0,125,0,125πDATA -14,156,37,123πDATA -28,190,70,125πDATA -22,188,63,119ππ' Player got hit.π' Frame 9.πDATA -5,129,23,112πDATA -13,101,7,98πDATA -9,76,-9,76πDATA 0,119,0,119πDATA 6,147,21,147πDATA -14,174,30,178πDATA -8,180,41,178ππ' Player data.πplayer(1).xpos = 60πplayer(1).ypos = 0πplayer(2).xpos = 260πplayer(2).ypos = 0ππFOR i% = 1 TO 2π   player(i%).mframe = 0π   player(i%).tframe = 0π   player(i%).frame = 1π   player(i%).strength = 30πNEXT i%ππsplat.frame = 0ππ' Instructions.π   SCREEN 12π   LOCATE 6, 1π   PRINT "                Left player controls:     Right player controls"π   PRINT "                *********************     *********************"π   PRINT "                  'A' - backup                'L' - backup"π   PRINT "                  'S' - kick                  'K' - kick"π   PRINT "                  'D' - punch                 'J' - punch"π   PRINT "                  'F' - forward               'H' - forward"π   PRINT : PRINTπ   PRINT "                              'Q' - ends program"π   PRINT : PRINTπ   PRINT "                                 Press a key..."π   DO WHILE INKEY$ = "": LOOPππ' Main game loop.πDO UNTIL gameend$ = "Q"ππ   ' Get player input.π   p$ = ""π   p$ = INKEY$π   IF player(1).frame = 1 THENπ      SELECT CASE UCASE$(p$)π         CASE "D"  ' Punchπ            player(1).frame = 2π            player(1).mframe = 1π            player(1).tframe = 0π         CASE "S"  ' Kickπ            player(1).frame = 5π            player(1).mframe = 1π            player(1).tframe = 0π         CASE "F"  ' Forward    ' Change this to a quick step forward animation.π            player(1).xpos = player(1).xpos + 7π            IF player(1).xpos > 280 THEN player(1).xpos = 280π         CASE "A"  ' Backward. ' Change this to a quick step backward animation.π            player(1).xpos = player(1).xpos - 7π            IF player(1).xpos < 20 THEN player(1).xpos = 20π         CASE "Q"π            gameend$ = "Q"π      END SELECTπ   END IFππ   IF player(2).frame = 1 THENπ      SELECT CASE UCASE$(p$)π         CASE "J"π            player(2).frame = 2π            player(2).mframe = 1π            player(2).tframe = 0π         CASE "K"π            player(2).frame = 5π            player(2).mframe = 1π            player(2).tframe = 0π         CASE "L"  ' Backward.    ' Change this to a quick step forward animation.π            player(2).xpos = player(2).xpos + 7π            IF player(2).xpos > 280 THEN player(2).xpos = 280π         CASE "H"  ' Forward. ' Change this to a quick step backward animation.π            player(2).xpos = player(2).xpos - 7π            IF player(2).xpos < 20 THEN player(2).xpos = 20π         CASE "Q"π            gameend$ = "Q"π      END SELECTπ   END IFππ   ' Check for collision.π   ' Player 1 attacking.π   xcheck% = 0π   IF player(1).xpos < player(2).xpos THENπ      IF player(1).frame > 1 THEN   ' See if player is throwing an appendage.π         ' Check basic boundary box.π         IF player(1).frame = 4 THEN  ' Move was a punch.π            xcheck% = player(1).xpos + lh(player(1).frame).xposπ            splat.ypos = lh(player(1).frame).yposπ         ELSEIF player(1).frame = 8 THEN ' Move was a kick.π            xcheck% = player(1).xpos + la(player(1).frame).xposπ            splat.ypos = la(player(1).frame).yposπ         END IFπ         ' Check against player 2's boundary.π         IF xcheck% > 0 AND player(2).frame <> 9 THENπ            IF xcheck% > (player(2).xpos - 20) AND xcheck% < (player(2).xpos + 20) THENπ               player(2).frame = 9π               player(2).mframe = 1π               player(2).xpos = player(2).xpos + 14π               player(2).strength = player(2).strength - 3π               IF player(2).xpos > 280 THEN player(2).xpos = 280π               splat.frame = 1π               splat.xpos = xcheck%π            END IFπ         END IFπ      END IFππ      'Player 2.π      xcheck% = 0π      IF player(2).frame > 1 THEN   ' See if player is throwing an appendage.π         ' Check basic boundary box.π         IF player(2).frame = 4 THEN  ' Move was a punch.π            xcheck% = player(2).xpos - lh(player(2).frame).xposπ            splat.ypos = lh(player(2).frame).yposπ         ELSEIF player(2).frame = 8 THEN ' Move was a kick.π            xcheck% = player(2).xpos - la(player(2).frame).xposπ            splat.ypos = la(player(2).frame).yposπ         END IFπ         ' Check against player 1's boundary.π         IF xcheck% > 0 AND player(1).frame <> 9 THENπ            IF xcheck% > (player(1).xpos - 20) AND xcheck% < (player(1).xpos + 20) THENπ               player(1).frame = 9π               player(1).mframe = 1π               player(1).xpos = player(1).xpos - 14π               player(1).strength = player(1).strength - 3π               IF player(1).xpos < 20 THEN player(1).xpos = 20π               splat.frame = 1π               splat.xpos = xcheck%π            END IFπ         END IFπ      END IFπ   ELSEπ      IF player(1).frame > 1 THEN   ' See if player is throwing an appendage.π         ' Check basic boundary box.π         IF player(1).frame = 4 THEN  ' Move was a punch.π            xcheck% = player(1).xpos - lh(player(1).frame).xposπ            splat.ypos = lh(player(1).frame).yposπ         ELSEIF player(1).frame = 8 THEN ' Move was a kick.π            xcheck% = player(1).xpos - la(player(1).frame).xposπ            splat.ypos = la(player(1).frame).yposπ         END IFπ         ' Check against player 2's boundary.π         IF xcheck% > 0 AND player(2).frame <> 9 THENπ            IF xcheck% > (player(2).xpos - 20) AND xcheck% < (player(2).xpos + 20) THENπ               player(2).frame = 9π               player(2).mframe = 1π               player(2).xpos = player(2).xpos - 14π               player(2).strength = player(2).strength - 3π               IF player(2).xpos < 20 THEN player(2).xpos = 20π               splat.frame = 1π               splat.xpos = xcheck%π            END IFπ         END IFπ      END IFππ      'Player 2.π      xcheck% = 0π      IF player(2).frame > 1 THEN   ' See if player is throwing an appendage.π         ' Check basic boundary box.π         IF player(2).frame = 4 THEN  ' Move was a punch.π            xcheck% = player(2).xpos + lh(player(2).frame).xposπ            splat.ypos = lh(player(2).frame).yposπ         ELSEIF player(2).frame = 8 THEN ' Move was a kick.π            xcheck% = player(2).xpos + la(player(2).frame).xposπ            splat.ypos = la(player(2).frame).yposπ         END IFπ         ' Check against player 1's boundary.π         IF xcheck% > 0 AND player(1).frame <> 9 THENπ            IF xcheck% > (player(1).xpos - 20) AND xcheck% < (player(1).xpos + 20) THENπ               player(1).frame = 9π               player(1).mframe = 1π               player(1).xpos = player(1).xpos + 14π               player(1).strength = player(1).strength - 3π               IF player(1).xpos > 280 THEN player(1).xpos = 280π               splat.frame = 1π               splat.xpos = xcheck%π            END IFπ         END IFπ      END IFπ   END IFππ   ' Determine if a player has lost.π   IF player(1).strength <= 0 OR player(2).strength <= 0 THEN ENDππ   SCREEN 7, , 1, 0π   CLSπ   ' Draw background stuff.π      LINE (0, 150)-(319, 150), 14π      FOR floor% = 160 TO 0 STEP -10π         LINE (floor%, 150)-(floor% - (160 - floor%) * 1.2, 190), 14π         LINE (320 - floor%, 150)-(320 - (floor% - (160 - floor%) * 1.2), 190), 14π      NEXT floor%π      LINE (0, 190)-(319, 190), 14ππ   ' Draw players.π   IF player(1).xpos < player(2).xpos THENπ   ' Draw player 1.π   ' Draw right side.π      LINE (player(1).xpos + rt(player(1).frame).xpos,rt(player(1).frame).ypos)-(player(1).xpos + ra(player(1).frame).xpos,ra(player(1).frame).ypos), 1π      LINE (player(1).xpos + ra(player(1).frame).xpos,ra(player(1).frame).ypos)-(player(1).xpos + rk(player(1).frame).xpos,rk(player(1).frame).ypos), 1π      LINE (player(1).xpos + rk(player(1).frame).xpos,rk(player(1).frame).ypos)-(player(1).xpos + rw(player(1).frame).xpos,rw(player(1).frame).ypos), 1π      LINE (player(1).xpos + rw(player(1).frame).xpos,rw(player(1).frame).ypos)-(player(1).xpos + rs(player(1).frame).xpos,rs(player(1).frame).ypos), 1π      LINE (player(1).xpos + rs(player(1).frame).xpos,rs(player(1).frame).ypos)-(player(1).xpos + re(player(1).frame).xpos,re(player(1).frame).ypos), 1π      LINE (player(1).xpos + re(player(1).frame).xpos,re(player(1).frame).ypos)-(player(1).xpos + rh(player(1).frame).xpos,rh(player(1).frame).ypos), 1ππ   ' Draw left side.π      LINE (player(1).xpos + lt(player(1).frame).xpos,lt(player(1).frame).ypos)-(player(1).xpos + la(player(1).frame).xpos,la(player(1).frame).ypos), 9π      LINE (player(1).xpos + la(player(1).frame).xpos,la(player(1).frame).ypos)-(player(1).xpos + lk(player(1).frame).xpos,lk(player(1).frame).ypos), 9π      LINE (player(1).xpos + lk(player(1).frame).xpos,lk(player(1).frame).ypos)-(player(1).xpos + lw(player(1).frame).xpos,lw(player(1).frame).ypos), 9π      LINE (player(1).xpos + lw(player(1).frame).xpos,lw(player(1).frame).ypos)-(player(1).xpos + ls(player(1).frame).xpos,ls(player(1).frame).ypos), 9π      LINE (player(1).xpos + ls(player(1).frame).xpos,ls(player(1).frame).ypos)-(player(1).xpos + le(player(1).frame).xpos,le(player(1).frame).ypos), 9π      LINE (player(1).xpos + le(player(1).frame).xpos,le(player(1).frame).ypos)-(player(1).xpos + lh(player(1).frame).xpos,lh(player(1).frame).ypos), 9ππ   ' Draw head.π      CIRCLE (player(1).xpos + rs(player(1).frame).xpos + 4,rs(player(1).frame).ypos - 7), 7, 9, , , 1.25ππ   ' Draw player 2.π   ' Draw right side.π      LINE (player(2).xpos - rt(player(2).frame).xpos,rt(player(2).frame).ypos)-(player(2).xpos - ra(player(2).frame).xpos,ra(player(2).frame).ypos), 3π      LINE (player(2).xpos - ra(player(2).frame).xpos,ra(player(2).frame).ypos)-(player(2).xpos - rk(player(2).frame).xpos,rk(player(2).frame).ypos), 3π      LINE (player(2).xpos - rk(player(2).frame).xpos,rk(player(2).frame).ypos)-(player(2).xpos - rw(player(2).frame).xpos,rw(player(2).frame).ypos), 3π      LINE (player(2).xpos - rw(player(2).frame).xpos,rw(player(2).frame).ypos)-(player(2).xpos - rs(player(2).frame).xpos,rs(player(2).frame).ypos), 3π      LINE (player(2).xpos - rs(player(2).frame).xpos,rs(player(2).frame).ypos)-(player(2).xpos - re(player(2).frame).xpos,re(player(2).frame).ypos), 3π      LINE (player(2).xpos - re(player(2).frame).xpos,re(player(2).frame).ypos)-(player(2).xpos - rh(player(2).frame).xpos,rh(player(2).frame).ypos), 3ππ   ' Draw left side.π      LINE (player(2).xpos - lt(player(2).frame).xpos,lt(player(2).frame).ypos)-(player(2).xpos - la(player(2).frame).xpos,la(player(2).frame).ypos), 11π      LINE (player(2).xpos - la(player(2).frame).xpos,la(player(2).frame).ypos)-(player(2).xpos - lk(player(2).frame).xpos,lk(player(2).frame).ypos), 11π      LINE (player(2).xpos - lk(player(2).frame).xpos,lk(player(2).frame).ypos)-(player(2).xpos - lw(player(2).frame).xpos,lw(player(2).frame).ypos), 11π      LINE (player(2).xpos - lw(player(2).frame).xpos,lw(player(2).frame).ypos)-(player(2).xpos - ls(player(2).frame).xpos,ls(player(2).frame).ypos), 11π      LINE (player(2).xpos - ls(player(2).frame).xpos,ls(player(2).frame).ypos)-(player(2).xpos - le(player(2).frame).xpos,le(player(2).frame).ypos), 11π      LINE (player(2).xpos - le(player(2).frame).xpos,le(player(2).frame).ypos)-(player(2).xpos - lh(player(2).frame).xpos,lh(player(2).frame).ypos), 11ππ   ' Draw head.π      CIRCLE (player(2).xpos - rs(player(2).frame).xpos - 4,rs(player(2).frame).ypos - 7), 7, 3, , , 1.25ππ   ELSEπ   ' Draw player 1.π   ' Draw right side.π      LINE (player(1).xpos - rt(player(1).frame).xpos,rt(player(1).frame).ypos)-(player(1).xpos - ra(player(1).frame).xpos,ra(player(1).frame).ypos), 1π      LINE (player(1).xpos - ra(player(1).frame).xpos,ra(player(1).frame).ypos)-(player(1).xpos - rk(player(1).frame).xpos,rk(player(1).frame).ypos), 1π      LINE (player(1).xpos - rk(player(1).frame).xpos,rk(player(1).frame).ypos)-(player(1).xpos - rw(player(1).frame).xpos,rw(player(1).frame).ypos), 1π      LINE (player(1).xpos - rw(player(1).frame).xpos,rw(player(1).frame).ypos)-(player(1).xpos - rs(player(1).frame).xpos,rs(player(1).frame).ypos), 1π      LINE (player(1).xpos - rs(player(1).frame).xpos,rs(player(1).frame).ypos)-(player(1).xpos - re(player(1).frame).xpos,re(player(1).frame).ypos), 1π      LINE (player(1).xpos - re(player(1).frame).xpos,re(player(1).frame).ypos)-(player(1).xpos - rh(player(1).frame).xpos,rh(player(1).frame).ypos), 1ππ   ' Draw left side.π      LINE (player(1).xpos - lt(player(1).frame).xpos,lt(player(1).frame).ypos)-(player(1).xpos - la(player(1).frame).xpos,la(player(1).frame).ypos), 9π      LINE (player(1).xpos - la(player(1).frame).xpos,la(player(1).frame).ypos)-(player(1).xpos - lk(player(1).frame).xpos,lk(player(1).frame).ypos), 9π      LINE (player(1).xpos - lk(player(1).frame).xpos,lk(player(1).frame).ypos)-(player(1).xpos - lw(player(1).frame).xpos,lw(player(1).frame).ypos), 9π      LINE (player(1).xpos - lw(player(1).frame).xpos,lw(player(1).frame).ypos)-(player(1).xpos - ls(player(1).frame).xpos,ls(player(1).frame).ypos), 9π      LINE (player(1).xpos - ls(player(1).frame).xpos,ls(player(1).frame).ypos)-(player(1).xpos - le(player(1).frame).xpos,le(player(1).frame).ypos), 9π      LINE (player(1).xpos - le(player(1).frame).xpos,le(player(1).frame).ypos)-(player(1).xpos - lh(player(1).frame).xpos,lh(player(1).frame).ypos), 9ππ   ' Draw head.π      CIRCLE (player(1).xpos - rs(player(1).frame).xpos - 4,rs(player(1).frame).ypos - 7), 7, 9, , , 1.25ππ   ' Draw player 2.π   ' Draw right side.π      LINE (player(2).xpos + rt(player(2).frame).xpos,rt(player(2).frame).ypos)-(player(2).xpos + ra(player(2).frame).xpos,ra(player(2).frame).ypos), 3π      LINE (player(2).xpos + ra(player(2).frame).xpos,ra(player(2).frame).ypos)-(player(2).xpos + rk(player(2).frame).xpos,rk(player(2).frame).ypos), 3π      LINE (player(2).xpos + rk(player(2).frame).xpos,rk(player(2).frame).ypos)-(player(2).xpos + rw(player(2).frame).xpos,rw(player(2).frame).ypos), 3π      LINE (player(2).xpos + rw(player(2).frame).xpos,rw(player(2).frame).ypos)-(player(2).xpos + rs(player(2).frame).xpos,rs(player(2).frame).ypos), 3π      LINE (player(2).xpos + rs(player(2).frame).xpos,rs(player(2).frame).ypos)-(player(2).xpos + re(player(2).frame).xpos,re(player(2).frame).ypos), 3π      LINE (player(2).xpos + re(player(2).frame).xpos,re(player(2).frame).ypos)-(player(2).xpos + rh(player(2).frame).xpos,rh(player(2).frame).ypos), 3ππ   ' Draw left side.π      LINE (player(2).xpos + lt(player(2).frame).xpos,lt(player(2).frame).ypos)-(player(2).xpos + la(player(2).frame).xpos,la(player(2).frame).ypos), 11π      LINE (player(2).xpos + la(player(2).frame).xpos,la(player(2).frame).ypos)-(player(2).xpos + lk(player(2).frame).xpos,lk(player(2).frame).ypos), 11π      LINE (player(2).xpos + lk(player(2).frame).xpos,lk(player(2).frame).ypos)-(player(2).xpos + lw(player(2).frame).xpos,lw(player(2).frame).ypos), 11π      LINE (player(2).xpos + lw(player(2).frame).xpos,lw(player(2).frame).ypos)-(player(2).xpos + ls(player(2).frame).xpos,ls(player(2).frame).ypos), 11π      LINE (player(2).xpos + ls(player(2).frame).xpos,ls(player(2).frame).ypos)-(player(2).xpos + le(player(2).frame).xpos,le(player(2).frame).ypos), 11π      LINE (player(2).xpos + le(player(2).frame).xpos,le(player(2).frame).ypos)-(player(2).xpos + lh(player(2).frame).xpos,lh(player(2).frame).ypos), 11ππ   ' Draw head.π      CIRCLE (player(2).xpos + rs(player(2).frame).xpos + 4,rs(player(2).frame).ypos - 7), 7, 3, , , 1.25π  π   END IFππ   ' Draw strength meters.π   ' Player 1.π   LINE (20, 10)-(player(1).strength + 20, 14), 15, BFπ   IF player(1).strength < 30 THEN LINE -(50, 10), 4, BFπ   ' Player 2.π   LINE (300, 10)-(300 - player(2).strength, 14), 15, BFπ   IF player(2).strength < 30 THEN LINE -(270, 10), 4, BFππ   ' Draw hit graphic.π   IF splat.frame > 0 THENπ      LINE (splat.xpos, (splat.ypos - 5))-(splat.xpos + 1, (splat.ypos - 2)), 12π      LINE -(splat.xpos + 4, (splat.ypos - 3)), 12π      LINE -(splat.xpos + 2, splat.ypos), 12π      LINE -(splat.xpos + 4, (splat.ypos + 3)), 12π      LINE -(splat.xpos + 1, (splat.ypos + 2)), 12π      LINE -(splat.xpos, (splat.ypos + 5)), 12π      LINE -(splat.xpos - 1, (splat.ypos + 2)), 12π      LINE -(splat.xpos - 4, (splat.ypos + 3)), 12π      LINE -(splat.xpos - 2, (splat.ypos)), 12π      LINE -(splat.xpos - 4, (splat.ypos - 3)), 12π      LINE -(splat.xpos - 1, (splat.ypos - 2)), 12π      LINE -(splat.xpos, (splat.ypos - 5)), 12π      splat.frame = splat.frame + 1π      IF splat.frame > 5 THEN splat.frame = 0π   END IFππ   PCOPY 1, 0ππ   ' Adjust players' frame.π   FOR i% = 1 TO 2π      player(i%).frame = player(i%).frame + player(i%).mframeππ      IF player(i%).frame = 4 OR player(i%).frame = 8 THENπ         player(i%).mframe = -player(i%).mframeπ         player(i%).tframe = 1π      END IFππ      IF player(i%).frame = 1 AND player(i%).tframe = 1 THENπ         player(i%).tframe = 0π         player(i%).frame = 1π         player(i%).mframe = 0π      END IFππ      IF player(i%).frame = 5 AND player(i%).tframe = 1 THENπ         player(i%).tframe = 0π         player(i%).frame = 1π         player(i%).mframe = 0π      END IFππ      IF player(i%).frame > 9 THENπ         IF player(i%).frame < 14 THENπ            player(i%).frame = 9π            player(i%).mframe = player(i%).mframe + 1π         ELSEπ            player(i%).frame = 1π            player(i%).mframe = 0π         END IFπ      END IFππ   NEXT i%ππLOOPπAndre van Wyk                  QBASIC GAME DESIGN TUTORIAL    Commander_Omlette@prodigy.com  10-19-96 (13:24)       QB, QBasic, PDS        317  20929    QBGDC.BAS   DEFINT A-Z:DIM SHARED K,S,B&,Z&:V1 'Created by PostIt! 7.2πSUB V1:OPEN "O",1,"QBGDC.ZIP",4^6:Z&=15440:?STRING$(50,177);πU"%up()%9%'%R-%\ORaBD\(6J0)7%%*-%%%.%%%%ns%ywtS^y'y&jzF]URi57*Bk$πU"yA/(jij+'=*.+j,#iUk1RorV7>*t<PQ&M8F(,WfGv9&P,E,iWXyk6E%(',+)k?uπU"Rg'sHw31nuwqpdQP+O^i)TzfHVg?9[?8Hq=-&d6:?3Xkiq7:YsbtQ;NH&]L#29FπU"F4-4z#DGF2/V:Mx^>-8B?f2CaH%>HyX2;2b5+c1-4$lpQCV1*JgH&k'tOQ7JEkdπU">L$X>]$O.$oH*)iLd)Tu0o#a*s0fTi8:_maJ9#U&b#'#HqcF(L1w];1\ES0F#?FπU"8FY/BNeopgSpJbbgny6$1h(W1%BrEtgkPo1M^4I[nrS>-eFZ)$_JHP&G2f:sTlbπU"IM%jz$p=BG7DtRD1eskGHer))4EcIq47f:k.pEM[&<Kx&#O/hkwk)m0Ti'liUF(πU"CGjL+wgy=BGYUc;T=QL3cTtc'gNN#*jTGC;zRA*M\j&+Swr'V':JfxcD[o2C1-UπU"(sR^/pBCZ[y.tH_80O^72hB#A,/0Z<$0p&df8m,VWF#;<ihhtnkf9lF/cqUx&j5πU"9\n:6*^tb=?fE\#Q4:UZ\Hm&q0w/RDVNmd<tE[eL-5WlogI0kR3BBBNGajeEg?aπU"PKF%i21gposCpkXGG'l5(H(;;+aja$Wfr?%Uc.o=7=)BxS$JSw?.OO#DcVs.tb^πU"+Gmt/wL1fGMQ[Y7/rk4=xkoAT.Q?lUuGt1p7fTk_w(K&ut%Flb=2/H_p-jIxZ]$πU"$)4k)G2Ll4t%bGJcQ)rDwn]Z2/isHWH22iis--)ehcxbM1nzQ9I8)xik(=&'L+GπU"rnZ^+o0nNBt#lJwU^C,YFsW33,tq#L1McIBJPJ,(;d$T1cuN)Ci'%L*D/s>joj\πU"goQ(RO1MdpVLWkO+GH(LE<1cNah7X9rWMcx\$Q>^*/]Jw6gfOx^rgBMTV#3Nql2πU"HX+]yS25/r[/OJVpePSrVBRip8jR2lG#H9&o%i10LM,,)&ux7Ws9rT+ZqkN9K[zπU"1)E95>SL\F>=HhY#Z>K$T3qbWop&2OY3OEq<wDFrsAUV%u=dM)fq<=i,pU>dN&6πU"(Y)OUIfE^;m'v4+Cp1cLP]PgeL:?>)Tw^r)i-r^mtu/?tUQmTj%kO.SFfeM=oiMπU"N-xYHg+Ato4o/7tZlow%N%r=T;m/O6DDcC]L?vcqf<m5x17=RT[qnTGK)Eh.Z&yπU"[<GIoefq_w7gLJO;Bz3&RyLk(+S::f?*B),ZpKkGm(pibvXomM?Q%MIMG>B_j9jπU"EIg$9J[%[$taWJ\=+=C1X$t3k#Z9VknUv#f3LwXYN6-t9nh2UJ#=?$J:'t?xLK%πU"nxEW4qqTk0&CQrx-4'jLup%()9%%'%-%)/TaB6T.UO&y=%%*u.%%%1%%%%vgfx%πU"lihV%SUUVW-(h=cU?6x:sOhU7G'Qg0G,lwbo'B#)_4>;nqm'%?;F#bVAHU7?2DeπU"Sk^ZB^(hP%*5Y;>uSoeWu=$,4a8m9R*$Km&rsigGxcrFDvut\w$;>Ho0>KYu;e%πU"0GF:k':T>Ho($Pvwm62HErP<xMMb#1go_Ak>*\OC987'RR,+]hss8+$2)$E/:RpπU"rN*x)OYS)?.2,*?HGN78<6FE]HqlP5%j.qzQY?]RpuC'OFwcfwC2Ck>g1:nZkdLπU"ZptHogsHuk+Y,&UD%808<kr-eDsDogskp;G$Ktn3wDdJv\-n/bs(NU)sNqA#l]jπU"_i>1kQp-/0lEzdfSZq-A-NNk/bAIzG9.:y0m<.',KYwS>/YIUW(tL/InJz*mcYUπU"iI(Whv=yc/j13-MMNJ7B245hPdea7IDmf]I.nZ[3YoGgP4;s3-sUPyCZPrdLjNGπU"(p^F9$:)ua[cm-]_14DoTD:a(57g\_=LL7q+X>g_+RN-j[4lhF[I?Te-EZ+Kq&eπU"EY+02gB;he=^%2#duZs5=[%5j1bSyi]BA4C[#bQ9+U.fLoMk0)='_izSm^VpU^^πU"8YUt/&lolL-3Z()^t$oI)7aGIS.QeT/'c]Y^gRV%B:/V1mCAtLk;L?f6F:>SinKπU":BlOLVL_6?XdWXEc4*dsk(2?8BDQmX+UR=r.63XtIgx>uH,d,Who[aI$sA7Ft58πU"tKd2n.gbm$U<89Q%[19DKLZcLu_.mb?bBOV#5*'k*Q_HW\NKU&gO;:I<0P$=EK>πU"vtdhj1k+cmI8kCl*59X.8$RGSG(g>/iX6-G,PJ(XqCng;[<x+AssPk7#cGf&uj^πU"G0AZ0tp^'JpzobIP<.&=udNjM.7%'2%7hWI\;te)Wn[Q)/ApMdVhM#oGy1R\,'lπU"/?MUGo'$DrmC:Vpi>+jYW/rZhpO8hNSPXvPU?jzgA<Oxb*=4irSMIVT[hKDf#S-πU"mB9DgdMKk72%u18zHx(K89m])A2&dc$Rb<]w(VtHPmJK8M2$mKqi^D_l&^Ufb5hπU"7T1te#a9m58%,N480-:.9\Woj1;*o*_qrdg6\y:9ZACf?YECZP9-ZR.,>3#i_rHπU"aGD4atOM&[v<gtkFuYmQqoi2K;r,0.%tB96g.CH=1BygjT.9TcMHQQMwf39DN,sπU",)('g,#+5KaojawTo##W.y_dQ>XqZiKBh\;R]]wb9Th#oWpwT^c6?u:Ru8/b,;]πU":;LB=gcIH1\_p-ZwuS32kq:d>1dV-UelS*M;2$jq%V&H_s#k/OYF(S'VH,5ojxdπU"z_G#m8#-2bl)^H7-fi+bQ$'qbA,I#QHe(_dk*MRR5B^^B#(ja*$H&JodR0t,'\tπU"?lWkEf98xji7NI,S<=PPTPea,t.osoqjl.Tkd_6otpDl/;C.\MmtKnc-C-V\1R#πU"%Oqp6Dh)]=W0bG/jAY,&qHyf447w\x)HAa#=Aaa$=;9GKxf>#;&wwsw1?8Z090+πU"L&6%G>t-CXoV#D^\eE+D%lp[JY3&>u[l1KR'Hb0jB?kukPObMB,cCrQ/GT/Z9(8πU"jNHeN-QgL6g+LWobU;VYNi:ZMr7_%BoMDkcqe.bwQ5bl+lYnI=ib$_[C3o;w7(cπU"ip*cAwbNR3j&(]*wL/BiX8+Wj$c*.Vf+PgF$UvcsA]RBN]yP\oMna]NE(k=RYoAπU"o2_)F*_Y*?5&u[$(PGKH%^)0(mJDk/G_=15vm<Un_Kc?E-DTjPG;ICX9PJS,mcvπU"n+KKlaJzLbVBY=SnAvg<X5OADbTk<9sL##CQS+#8'uzcQZaS/A5<L/xE27>))snπU"EBsiCBpgSf<=e%f;)/gca/BRnWisKRc;7r1\66%u/t'su^-UwW8T&]c<<sAN2)QπU"a\<M;(kYmr,zG,dC,[fXiiOh(k_R-IwH*R?0tA^71pKMv[CBHk[-is?le&pzek7πU"1*4\sjuI0V,m&(qHj3%aGqLIJ,gml,<2>.+1oedBQE&)hcTIPOc)/tEdhIzHK*2πU"FF[HU+p>IZbm6]J?=s^5KN8)Y;59NIzM#2,q_.9zkiGt#ZYmPAG?MOr#)HET1BBπU"=[T3Z9i*H;l=FEbf=FJ2-l)]pv-wOx#\oC+WPX61#du.#?$s/#IaH1U8DUL(BWlπU"<BCwv6<3]SGOL?9S5B[I(e31C);hR).I5,'cC.9c;e91'UcAI5R&:pSgOss<raYπU"=kKE0;E80MeGtO0]O+C=fh0DCpG%g(GXNkGN#5Eo=?E4Ukc%211PIVZG'HH5%0XπU"o*xn]=4G%TgF9\3O/#oD%IEObZ9_:O#cOu\8$\;)M')Ldu$OP1MQJ,H0MzZWI8ZπU"X+Fg(oLtv;?uQS<:/W(mCB^GJ256m%yBQwN/CJUKuDImz+2I1'vrpk*=^&BL6c8πU"ft0)m#19T]UN5+i3Ue[z=)aI+?q1.XU\Y2HUl?iFPc^(1Ukp\iovcE[ccTP,[c^πU"Yr2Na8I+Hulb::xhEVB.#u1$_hY5\2Lezrrd;QpxN,V+Noi.PxKjtn?pbohjUsAπU"Ic/plFopIKvjAnDhpWup037F[gH/>1mi<cpC2SOx=l(]Z-y\Xo^)FA0eP]CAR<PπU"/)5:7^k%o8ha2A^$]EF#'LY6B?5wXnc9&Q$:'9.kWZyZXP(0vWM9<f88a*BDr$0πU"669]cw4G/GVUgoQJpvQWNK<pOjCfr)Uhd-uIuUhSl$#[kpFU4:v'>FJ-2xkqrRPπU"^_h&<irJ)D>=t&r3r*,n[8g_+gUOOlKZ/F(xtrXS%,HF;D\vf.e6qY%aWqAi$w-πU"q%-P5qC1Dpm15LrD$6S4hW1+n^v;crrXMkeo,0A\.,<_DJgPj,RH:oZT;gVzj*RπU"NF)x1M?1-[e]fuMZ&C_&:qO^](v0&::F8T8US66c6o*pj+Q+8N&E3U+vv=)F24SπU"[T\%P]3EUM^=PI8eY[H^my/<19^N;9jd2CH:B=PZm>MHQh6KLR*DWm_.kj1Kv?%πU"zLaR(DGM1*n:fQ)8XotTXt0qxD2J[6Uh?#Dnq=)4e&qQybrd>3?M_0&xKfo/OE5πU";=:\pEsMNx_N+3<c&)NlRV]4tb0OZ0((e3DoBoPJ<(7pV=r16OESUY^[IZ(ajJ<πU"7f];:;<O*n)Jz,)[)oN;ACqzz*Q5.Um<_%5D$:6&Ro*mYA332g8NHUfbm6p46^LπU"j0s7_NnZRB08'NmXLbeIe)-K-^i7fcP?u57suUg\Ub[9v_=j,:x8XB>?_:l:j/SπU"&D$fiXmLxW>R-7()i3lm$,\jHCL^NkbWMv[29*UT5b4[.F=n,^_qs8g0z+e:^wnπU"q0'7=<=w$QTjLJ?$IkbU%>Dh2CZqpZ\\oJw#sp:]V6vR=FOC0hA39q6VPHp)c.mπU"PQX)9FLkBK+%jk)<8ZXYvrOnx6(I3K3)i1Upuofs]LjT+;>0tccuFoMWs$lQcqqπU"b[o&.%[(X:9wF[2fvV03Nh[fgp1+bVGj^7/Rhp)fkHo-HIaGwH+(wH3:8-8IU/$πU"9yg<;OL:j),Qhxkn#&1SyN0tO3CeYQ(E1hd'1f-&^/G,li5\PpAccPkq1q3cx-YπU"B.4<p#(m8X%6<S#rv6dg**],oVEg;/:$T<)X*]NZo\X'Vs3'4IwJxG?VPS,M'/$πU"fQQ0(mGJh1Vk.s?UAuDs_$Oa^<rZ?gUGBgbFrYQE5Av=25VrGmH,wX8Gd<,Io/9πU"YqV7Sen)',6/0N<q2Y5_US?H%vZwFa'UklWYQE%xxg>^[mtG9eM6.1(0Ep<oxkGπU"1W3A%n2.GF-h%,6V&2Vz*R6[%NlObVq9>e=(w_p^Wr%nJD9t^buF5ui[DsPI?'<πU"%'<7(lORrUZtFJ'Y8-R/6OhU\xhlHXl6W')'B1BTY*eGwq?nObNAY(%WVPY*Vx=πU"[J7W8.vR]U3dpRA;Aa0lqh]nOan:D-\STf)My<JAAvbUZ.L5C$J#NpE39;]'62KπU"&t0ckjT>.1'psdTWhHaV^<gR>-AJH_S=]C]O#fU^hNkeBHjLJ.Q5]pR\<mCjT/0πU"q)arOwXt\m[N,IhwzHh31)D[YpwR*6/iq9)KD*b0eu4BZ*')81.BW9HGR:1IVH.πU"Yq(LW_2HUN_(g80dqx/kXUDm[Q/]So^N/7&F3c#k[i,fj>KZ]_mX$*qWVqJ._?PπU")3;4RAoSJQ<p4-43:IPaJta+gOlZNJrXU?/JKZ&oueLj&>r]V[TNPGX>,GLNkXAπU"8IpxW5&dIf%[-MF?8y.HfsPenw%)e'CIHReKDdJm=:?xaqgM9M[Flx>j^]/rxv&πU"ws8ZuvLskNsm%.A:qup?k]=S<$#6$WGKV>?c+n]*F#W#oza#vH,P?Q[\l/oJ(IMπU"$LUDd8Xh,0j&xSrTZG;Cic$YYI)_f:EJW6=wt6D3qZDbAok;M,RL.^5I[Q6lNp_πU"o)D#quq#*vr5^HHa3Q*Zsk=kC6I7GmXajFAnml>FOyA0&,[bytQ'E6A0d?=q:tBπU"ZM:YG*)oG*Ra^8C.)$xx&<.Jb4KsRVOha'MjEBq[SB&j#--EaUFvE5Gs8aHDUd;πU"g<CLM0I$>pT2ih[h\QfkOWA/3pEL8mIfKF..miP]a<cR4ljR2syIHNGU>Ex8p#CπU"YTFz.0S\5c+bHm#(.KSoS^N?f*GYQujZs)5Mr(i'i9UJ-\+yg7?U4d4Q]ob:_.8πU".XfJjEzNkYT0Bk2v^Me)K#o5U'K_YGgpJou8VVutEujlEp2w\-Njxueptku6u.XπU"Xd,Xz-Cp,Bfva>UQ0jum9T<>rJGcz>3Bh];0:15*EJRM&%$3bW\0ORY'v_1<7u7πU"jPB6n=d]7<H4lNlH?+cE.,_iOIfpR?o-'Cj9:u>)6U%3g2IOGH(;UIYa$0uv,PuπU"m_e](NQV%F4a5hP&R$OnY.dcj;GB?_e*ZBq8aWa0u*D_GoEV1lKMEAI.:a)6RYaπU"2k+pJldU,>o[fuNi\0HC*o,PcrK[o.UR^^)rIdDnk]Sy_VQLwMWR*coz#5n=/hUπU"ulfNoV?qFBfiediiY1].8DC^AD:oYA4x$(p6:,N5x>EN'7yo.gW$Z()V6:5z't3πU"[8x(:=d?D5pc&#hUS-h?L=OC1:9/0$,mxPV+q?a,:3jR,\hNvkEW_UBSz&0'e?,πU"1_40F+<#rp$&UDTAl3WHL510:psfVQxq%rW4SOQq*HLPz7wK]Eaxq(lURS#:M<(πU"i\cR%LOSJQd]F(HUF\>DQ;9zPUT29AHmW8U#T(-PMq>T_>g9d1zcphg$uAg3OCwπU"c?u(k/_Y-sHUtY#/?_>rJ\Y:E6(8U&y83V'Y/P<]^=Eq=q[36/gc;<c3$-1$SZ*πU"t6x#IG]iRn^]XAs;QttAn'+hb5epa>1):3Ac1bl5(,W3Z&a6]*Nu;Z;>VR4M4%(πU"EWAE;JLJq%)NwShbaVEA+f'S2&Fqq:Z&t6/)hiipZJW_(Y=<ii&lxwa^5-KhPuYπU":P4.77Zo4o+URU\%Z#tiNm/DxYEF5>zmT2(>c,%KqZIcnw82rlGYs?J8sdsaa8iπU"nlg(dCZE[RkdFl$1GAZNGtS7E/sm_$5n+keO)q>R\wGn>?H=mBRMe0FxPY.)'q?πU"90Z-n>80uqN+2J27KXIDQD?(n5qZb1acLAT?MJYFMZU[_X^tL4fI?iYU#Z2)M8/πU"+>BHQa7b2,=/C5_Q*uF^i:MP7+)[Zo.^?ig:DBAk*=VX;/MPi#GwqsjwfhZx)asπU"I)a,jJ](9YDUvC26o8)MagHmr8ZW'fJBrP\lD2](LXm%Hq.p_AcnFOmQ:,3t/1KπU"F&i+HrL9dUqMc%jX'<i%%fNlBWDrMmKsr)RAS3<1a,09Dz)M#9,]&]C-SJ&CMfXπU"bl/N[U+>rY&</CV1&;nZ^>kKRuRK5;Bj=tl5Fi;pt=t]$UcbeB/rNGuv))g9p0MπU"_L&fRpgC1#(=>_AXSzC0*)B#R^Lv([1Xim8l<.5iUbZJipR,we3%yz1;#:h\EL'πU")H7*ax=gk#K6T/3=Z/7vVj[I<srla65,uK.yIdicf%A?GpWCGgZXM4b<n3:uIπU"mcK*3-63([II&0_1=c:\7Bt^%/Tfc;N0R%^gg^]8%J]oeFHCO/:xcEyAjwk4+e=πU"PnX5JaWC[^HdpXem,iQYb6/f9]E0Pldy50cb+URh3Rj6t/V<_^Zx5AngFN1Mam\πU"ACTdlpWm7IcbMvV]^WmRoX4oub4,0>;T^Wl(TF\k1VIj,ff<LuG>foWW7+'WJSgπU"Q8tOHzQR=iB7eT%_I.P[z/<UnZLCeF_neFSfPr&n$lLH)tmST&RtBP,l?LDpQ'^πU"j2/bqIkn]fonC-ML6YAxV<#8?1isJlvS$Ms4h(*0RMk;HZHyY\-dr+w-]pg7yNJπU"5]ia5;ms%M'iiz?.kchg]5zks/'C&3$Dc+CYu:ezF;eIs*BIdl41<fssNxGJo(EπU"E*hTgS6szNG$,sKI]8YQwmd^9_IC^8hq)kg)2WcS3qoC)bFE=)ZFMgXO%hz[3^dπU"j<3HB>HgwbpLwTonjOh%>.X2EsZWCJfZ1FR#I\N<bW0(?lK,XdW>>]gsxP>gON'πU"bGi3%DELE%wAM_uL1t',[+X,Yylg\FY=2bn#n>HpvP#aJJNU<j<YV2DEfT&=^>QπU"2&Nu>6x-YP9:OsR95En9CuItL.7h4';JqKio]R$STpa.?KI^Q4CnGt*m+v$eNaQπU"We+1*<Lot6Yp[dEMCtMZfioD\aPN&)EM>-0\xz5Dq?lh'-;TLo,ljF)8ihCkN(oπU"pa7Rxc.Xl4VG.:p'=n<e&s7NgB,hlp3;P-/Wc76:ZcU4hM81i1zMGU9Ii>p_B#NπU".V;To7vIOKAlPQ_yXo:&/+;6?+bpM1hQ+Z0+0ek6>=X-B1?^U%BG/?fJMWmLQ0\πU"2&(3#6:b+?x(Bto,ihDkd%>)[3('pwY6#6Y_s$0*R>i;2=H?0%E$A1]\_o5yeM4πU"asftO<B]K3aSO,AfK=e<6<nIM'aZfJwp>J8m6HaH3_]IvV9M5j)M97xq]Y]CJdwπU"=L.'a3$&XD]N+%+5=>:&pI.o4<9]n$\>%BDfwD0\;yx2<3SJWn<ck(Rb0XlEBU(πU"q2\BsD:oWHQt,(:Cr[%f/oN0bHa1VobECw*fR+xQrO34kpso=wD&>XG8zL7r+U=πU"YeEIWfi/mJ>$2CV.nfqdAALx:7>#>l)\3fb^gO^h%.>ISycf\<uWVTOPwye<I#4πU"[LPWJ9Hu;KOM+2FI-?(?xLw*HEn%Knh[z:r1SnOl21K7j3<=u4QjyVN[k]T[%f/πU"n&C%[]cq#OFocPgqvl\<mK+P+XXQnWUk9f7(.[HAvC)I0IDVJ13eaW[XEQ,G+d7πU"V;jSBJ9Z9%]Els:K5%#*%vI/x4^<^q8)'TQtQfp]JKbx.CP^-'2(d34;3*G<[NNπU"WG(^Iq9B9oIf[ydp^uxoi5N3QpXlgJVI)o1A]KdF_1[<O65_?C:n:7$3_UgCeC1πU"mXw,L?=CT#<*bJmfQ.Juc[mFYZkMSWOIvRlVV)nr6W=%7S+NBNNaHa8D^$RuQKqπU"+pQm]aJ+7^(VAY[j2LqE^SiQ$H]DYx?:G#aQFIM6OF\HObM)B1VQ[[9k4s1'IP8πU"7[r$u]ZL(u[6p(sDAI[\V:tLKcp+[u;E/jP<[9_WpTGpt3ZR>yF[P6Wj\_/jRY;πU"<[K';5wp\KQ3q8h^SaQE]1cD2d,O%erpCf)3;,),5J/=Y(3gwHp2Y464y4rb-^RπU"gqhy<mXtx6VH[2v:KP:Kds<eZl-#lri;lO/9B1-DC5,S:0Zh76nwOHtK3qn^elqπU"$LwkrR6<n_XdZ6P,Px?leG'RIw^[XSKCGw4v'jIGVtm/RD.eLX.%SeV:%,d%JKUπU"),9TqDYnA3U#i0XzOXS%%e%Jyf(qDbz5<$yPiA9d&IcE,,3F&&6BO2=:U\4Vgi,πU"EbO6n%D*h<L/W9SI'PDFKPuPe.='N'JM+mSLDJ*j]StUVvCd*kK41=vGB/.'+*]πU"BcJQZunksJ[emA>5Ci<=\j33N,G0op'-y$p_-:yF1Nu0;i_u#jVH&K^gq7VY+j^πU"6M'=_ShdZkD[\Gmj/IQd1Q_p6]Lt45t=,%hUjjNHj/.,>?j=iDBv<Ef:*[Xh9s3πU"6B7XCv2H4d#&YTlN>FX9uYnX'x,up%()9%%'%-%*?XaB/&365&.C%%*nd%%%1%%πU"%%vgfx%lihV%SUUWNf,<>d#^awRSexpcKAFKM]qdkI]8Ja/hx;^QJ&.AN/6BB'XπU"MZJun3NMGC0Q:6wOM];/P<S+3r,,XA)p:\]zjoYZWUai^hl2CMOHDYb>[*J$zKyπU"fqdnlGnxMfKw'ns<5P6?(AZ>YoZT^KkNHtsNHAx+N3gS?-rjbqjbXV'GSA#\2L(πU"Ru9w]jg7T=9q.rE%52W*>E&1.'kT[Lv.oYgXL5N[p)tH$>nkAb)b&F\wd'K>H=/πU"xuQ<0=Wcv)[sUNP4/t\WNG[:5q'M7(4p<oI6tC9nlw=^haW2J'4f3Yrj2RPV>$?πU"W7/l7Q&lusjEa9W-m%(^40Ix-5'bqLo02Zgo(V%fi*RcK5f;Iav/X4-QRlvC\(SπU"(+V:7XMmIxz9S#iS'N7+OY,%U9vwG6as1D13YX/1=Z>L-WduYusI;gYgf*1LJ'JπU"_Ttg2%irzSblC]KJt3C8oV>1+9h*2[1g5L>[L2\o0>qBcj:w\wUByB/d-iyKT?KπU"?3$G^31O8sYx$21v%'?qEyeRu[cWNAbI([euvRFmPZnzyM^lp$VA?OJbz029yNWπU"5TvAqxvuB=MYhHSDPT0TqyxAkMIDg&XEuV3Y2;WfeW?64uo1t#*tAyc\>vdT32FπU"fr.52mQj+BM42G$?h\CPJ[F%)i[A':?.hLH2Jhts.pl9+cZ.M(tYW[^>>vsfy2uπU">fK]svLst#[>=cfjj2:)e^?V7e:3HJN20B%G4z5EaK(2piM(KU]8mNPkvBQwjJlπU"9$8/lMoug)t]vRLF1jkeusN#Ojvt8^*dROWp&&fL-oJZAZ.'S8OklpVSlPeP'9nπU"Dho$)1DVi?vp2LmHXq.3kZN+<n5cW-t(6SRSqa=xcHCx'thGUAe#upO,E6/H^Z'πU"<pP:aR(y\pV:nN4[.qvk(-%LE2)Jb0c6IPVp<7;EN6]<_Y%s'r%+\jb:0zXGpAMπU")o4D,b_%_\MZXF]b;HysLHw#xi=*[>lru.,k-EpFu6*PbQm_8:hjjQEV4>wtJ\WπU";IhCL(TfF_5AV(X+sm*kynAYH'GT2zXi)''-b>%vW6okaw2b)aW<&'AUyFD[39XπU"JPQfS8ML;-%OBq=]['oD-X&KGc37)#DEY($[g;hrdQ'.$_VG[oeQfdOW+:FJ>^^πU"36GN\u\T?V(cebmUI-P^/rrQniKFk^juLa$c'dSz'aOFZ%s*XCzUZZsmCC*+Tq_πU"t\;aY'W>/\iS7q69LNOkxa4gk'914+/at'q)n1FUZf0mkzRW?JqLr>T%QWz?;94πU"Z-Fa%]biGLT(n5B*b&b)m%1NN4nF3-E)z*>s7h4poo:QX]Q5,PAjnPL[6\?vD)yπU"$FPJ>btz=oF^*0\n+,jewlGrrD^k0u=M,'Fk:,<62Q8#UBO.#gU>D)Duu)U(+uXπU"J58(87[Y$DiMchnh1gyi6_4A.dlQb92q#^[ZIr2F7ydLD:Z_nfLB_R5-v9[p.xxπU"LL&J'\YWAg^U1.C4a/dWO+;DC,+VeFW_t/[r-E^an[Zu/mf3'p]*a\c,36]0UC%πU"c^UtC39YOIG-?Z.:.m<r;D2on'\TMnuRHNoMK:bDOJ]b=5$WFlGXlg5P)SpYq-IπU"XQ)uBGBRc(G?lr8cEd)rhN;$4p.56u%Qi$AXU[oQA\TdKlu$8$pY>iD>lYk>h*mπU"*AEoQaGCXkuukX#j*FkOTM_d$#&ILoTVm#>_z7&lDhJU>TbG2w%b:ZOi5&n*^%YπU"Mm$a*:J#^UKK3ZJK[9sPudnoFY/qQ,k,KlnI;YG&N)D,?('Lv1B7M+.U9RXsq1?πU"$9L(sKuk(/$o=4t])_4U8SaP5F4]NgfR1+K'f0R[Fza5<uU^o_&RN,_Tt,ZFwwcπU"T&[D32Ik/PAVqm7=pp.VKa7^DDetk2Qs?%iguQT<&5DmG<2S5kf>,doRPNe'dF3πU"Ps[JoME=Fr6DK&Sl2X(&g]%kO=[.]BC1%ua9DR$/q2'U;TeuFX->mhoxjSV:.iXπU"*8.SnX-6G<exXJU*zgK>/CTt2vSaJCWmpMQ6z'[S>x+Dis;WR_Pm1AsKf[PxR[lπU"G)#**K;njBN^'q(CbOFyqh-8h9nK7F3?tcpK%<FtJoxQJY[H#l:Xj,g)2ovRUK,πU"F-?x][7I$$Wji5a-YJYx?_:LHp/?^FF4KDXf,LXCyHQ&&(,tan5vt>P/QNF54iZπU",22Ecpa?g>LCd?rvc-*\CEa&]UX/_tfQDoZNn>4-T_d;T*MKmanx<aEw;4-</*#πU"Nf(ip3=nhvkZnk#&95D'T<Xvs?i.E4'i%eeg7=rK<)j>LWoTi<O1>^zh?I.Xi+]πU"Q&n4'p<G\ngZ&nh+%'HHX^h:H$g1L2:PqIJmvFm[x'0-Q3R86/$1IIvylDM]n%aπU"irf03V)rjSN;2XPmEl^*8\(2>cu>Yio>Yi>+Yi#Za2es<]XeRXOuBm&es\u4jw0πU"lPn/<NIYn\eDetsgR#6CgpYDq1DfV'vd4HSxPh1'z6bB[uQgR,P=UvO3+H:=(T&πU"[9qA&V-kO,g1Pj2'g6DBHu0&(uCh>%P:40:Ie7AI4*=X.0IEhRVud*>RPT3?1+$πU"F[i1tx;K.n=*D5ssq2k[6sFd.s\Vs>=_-Nkt'9=\dGxK1-_O9X<o:=n_0[6q<%fπU",'N3*_5(Hgi4bIl5(v5^_T#4N#wk&\=^L;1ofRXf4i/XBR;eZN-EP$5WmVGmk.MπU"l+jtLfL?lsmp6J*&6IJq8VXAz<NoG)F'ta.0YfCa.yS%,40iQ&ZP>O\oaG8xqQWπU"/gsq$?v;l49mu&CkF)3d1Rp(hLwehIQr7WU/qk,bW7Vdmi2.Zq)i*'8kXGVgZ,'πU"4&.Cle&s2i=K02Gbi+nAShJcXHBV\pRnPCL(Hz.Yg\f5Sd3u6=-I),?bX*z0=A1πU"lFW=x;0-6P<31m5i/T._H#I9lo+7/QqgE&8UffbZ92yy3-580]rCfsw)puT(M%rπU"i=/+?pvQ21,fEUK;A[*?_fJ,/cu/nfso63I[c-LOC]^Ir>W$rw<SNp?Q);Al=.VπU"q#3T8*hTva&&Gq'MQN/FV$dB?IDPZPT98nA#neYesb(hnk/%8G$n2bN]IN<ReV)πU"k/-W.t2Az>^\0E>*)&[LVLf4gC>bcT_X7+Zq8s3W-0j:mdh&zN&E^57OAi_$C<&πU"[#$$k72$ACO7,ul'f0?LCPUl*equpSe;;^-5FR'1Z_#4S#<3uE=k9$;6',E/)<<πU"9q-n_m.EybVlFYP=Njc8O:=H[^MLA#($(b6:8&-kiF>9b61_,BU-]ZC=T5s;3u^πU"'sOj6Vmd:%]u>206wb[S'.7;W1/SPQaq<75#a5?TH/ORHl%1C3uH1$GX(IRgaCtπEND SUBπSUB V2πU"L?1V55ED/IPafM,S0gkq?=P(M26QXf[&E+;40cXv*akFx;7;e5qp+(*FYHNOOmNπU"qUW)8*6f2)$oq',L7FwAq-NZ<ABaTNQ$ZsX;WBDJxi&C2[/kTr_%6HV38,UnI&/πU"tgQ;<41o0h(h.%0-Wb[7_uCJ/rm1:$p7KHhG2XLA#Wk/\d\=?s];JuFq_f)[bZ*πU"L6<-Y;aVoS0cY'UGh=/GFg#)B/6LV(h]JoCvafGM#+lufE')#np\Ct**d<q3Vh(πU"Z%RSXn.+m?oZ#jhvL(=&)&6tY*lMQY)lxk2W[4oM]4Mum3;)Yif3Nh?:wIk>RZ:πU"f2Dnm\Z?wL:aJt%j4/(7P&7ZT<Y7u+HrveRI6Dh01.z^,f0uiZ?$/cSaZH;+N2=πU"9'uF)3*WNB2xdXhy>dS[>Zt^&LC_)Im)h),I[Seut/sJG6Mlo_x^Zf3h(_W4#beπU"F>0p;yIX6Z,f+l)))0c\QT;R7T;RT+;RT;6RXijD%;'IBDQ8ZGw0zzWXRY'Gz)tπU"ukX'\phY,)Jf[ezX:OGlw6mLe-6$^kB5.9v4,lL[yaOr:m2*7gv%^qDymD(</=CπU">oEX)n(P9QsTq6QFcvYi7C;t(Oi22k'E,e0->HlR;+G>>x/Gt5$N2mG0?MR0G/QπU"PVaU%tF/[e3T,AkE;%/n?ovG\'2bUOmJ'37eic#Op8jXTE_NdnID\Tyrr5PN=IRπU"Xj$(zN/E7C02aqfL*.;1&yf%M/NU1+Q$%-oROI4GED3S=N)rQXQ?JriOl=6TZwKπU"P^PCW:'UlS3+Ec\KEJT*fm]4T<^p#iE45QVJrnj'I,+g*CtQLk5%%m*X&^Rn?0GπU"_&F<4?[]pt3<gvsPa#K$jrU)+\J)KE>4aXf969\XxkkQJ-iTr:fF8$&kh<TwXLNπU"uMvYwst#un_Y]Q:[5]dq;GjI%W*EnVJ,^5A,OYCSY2(<=QeZbl.kJ'Wu)(9bS[gπU")izXS;TU5MAccjVHe6Madc*W5DK(ILnY6RXCTacTGXe<qAnGj-L:qnQOj7M,1ILπU"Y<L^'bmoHR'i%Qa&6>g\Ah(ckt(jIiAdNQbBCqm^j9%*H(Z%606fXYb?poaJWw>πU"-Ei*2Y%_CFg;5^7L^QvkvH6&L_h[oePtnV#o=/fY2w]Hq/D<ZNKS:oCDCI=LYVwπU"vUgH1+pTxLJFLOTj)g^X6[lFXj7)3cu-BbY1egES>P:;qmY4p.VuI+KxD(cLn+hπU"1u%F,RxWtC9l\BWuuR&T0$zRT(oGSy^x2Kd91#FhJ,q&ggDVRsJ1doQDeX%T-7XπU"[7c=U:qsAi'fY#s+7L%h14+VX:IPJJTQmYJg\ab/oWBb-BMOAi%ee].\w4N=#hbπU"xJbBQ&Qarr/j)Pe<5+x/C9[\Gb?/M;hrh+Lpsrf3UIep^<435gqEKqOq%e/9Uc*πU"T\E[,Vd>U3<1JKL>Ln]K#>]$]&1B^7elPf#jW.m8Oh<zXHad9,xI+vGgl>qhL0\πU"_CgF[&ro7[#lWQvo#Kuk-XH;shaxlM?.kLk)\T9HK,BMiD4#Pt=V0;UhR15s/=tπU"&d>fe%lS6K7fwcKa>tnqLfI8pXS-i)FLK8<N;o%].G1r0Q.,DVzaF#-KgyFT\U3πU"+]k'6_2jp17.U]iAI5C5bFaV$NECLA\;pF>=m&L*,22Q;$+?,gB2QgPc/5].:I\πU"t+^l<6*s**YZaZNA</_>7juKJJ[1CffT^Cl;4'mQo=TIjQb(OVK:&^VQq1+cO#uπU">;-)gaR^+FfPw_X9pJ$,/=rCqzT^lGEPGq.a/cg)Q=QQO3=QoaMQq2G3YEW8DHZπU"7)L&SVU:SQp*-m+UR:C:w.]'*QOVO*7rs-I:K6SYEoe)aaJoAuaP(-/EF8Ukv_tπU"C>)I3WU597hO>o8d8gnkg$uF4fDmi;j>:e#msbfS0Q]^6B]dOv;Zg&6J74HMm<QπU"5V5+.C4p%ElO4_[lj]qc>$]e8JII?b^5KPUI2:CTgTQ-[QKA=[UQ8sA^/#M?jv6πU"mYdkS*$K#<6lVN><D6$%L.Uj<Jn:RupDL+FQk_/Z:khD+A[9wp2$nEsA<om2Mp0πU"q)M(qlVc4-'R3WN:<A(+\Lx0>dS1drd5SRt>?.,:MgbVd5p(]6JHQGZ+li8ktQ$πU";CO^xsu*OV->OPbfoj&?tjn[J&uTb<5(tNrCnw>ENZKp*MD^jc9OZ$mDq169%UqπU"R6;-9o%PsS$a<Z^LC-;r(v+Z''nbfpt8rUU^pzKs^L>u7w33QIjed6v&'F#7>SiπU"E(.zb<9HFkk)kznNWteZS&$Z1u(J18UR-(=,Z(Z<RTD;TQL2=nU^*tRog)004&uπU"]CAMG.ZU4\%4kmWKwqkg&YlPY0vKx9ZV>(H/(rW4+WX0.Drfbu7GjjiGDU$znM$πU"^:hW7RJSM6)&+>Lb]S*flfPij[j<X7rA5AF<QKE;?l/tN'n%GMd.;zTcw605PQ$πU"TAqM>yrdWJiS)te^j96b#rT4$vVVJQzn%D68ZKoSQ/S>Rnm8^PG9?oF3mgm^H9FπU"S(TU$6Uq+y*O/2<&[MP]e[]A,hqf]m,B2YavG/o7;Hm?L7Tit8Sie/B.XJ<,J4KπU"mot1X#9<6BLL=(G;W&i%J:^X\73J$mV;BodXL*Np]Z(9TUBUBKE%/=.4ES.E$S.πU"ESn.ESxnNFSTa(&\<+q(>bU>'l(:&'lKi&gf[p$G2+l5n/W;Jo3#VO>0PNO=OoqπU"L75Q'=E+>\jev9Z&R:56nV9;bG4#_kOGswr7cQ5)MK[4HWV%t]4*+04MKE*DWEBπU"E&?6/]%4vRWHH0+[2uF4Y>yp;g?HO<g'PEfX+^Pfa[0F[0G>F*(l8lX-Oyl*gp\πU"(]]oC3QbUa)MBV%etOdzPE/t0qF$'8S];ObEacM8Zl/*-fxpVSJ+u<[#=+F?]79πU"I#hY&+uT7xr5kSOBGwPG9DQ,>k:FeMR;+ZXol%W/IDM:we4ix2Ns?d(XMj/([hRπU":nd96qA)c'hRZ8i2W*\pzTMyhjq==tZj%U:vQ0JD72].RkCX_W_&uQ(g.8J:%N:πU"&g_rD=u5R;kBOx6T;-wk7mMsnV#63qe5ducfTqtK(#FT6#T<[_sh/j%?NiF2#HEπU"W<uK\Ru<TQdEV?ik7z;UL*p[5mAO4*[W.ji59T,<g-Z;hF3Cu_A$x(^kNqrFJZUπU"w(;X*UGK<7eS(aQbPP3b<ltjQ.npV%V.-.?j+Y2YG29cj9M[nDv=L2qWFj16^YGπU"&-9ja1LYGpJ/l'wKLF;UV00c1Xao24UtiGLK$1uP#MaA4KRPgt4\mI\d7P#kDq/πU";&+1i[icvry-2c7ygb5exJpwU;hsoCmb,4JwkrC[>d&qR;MO'fV1;K,-S\2)[djπU"13cn;D(hKnbQM\^uDjP;nhTs4^g82G?Hiu-Nm'n]\wEtPLRZrL?l#1Q=MA8G_2-πU"jG=siO?4cTAXAgiX=./$j6Bn$VA.q_m<=Kb\&,MOG%8E6O[bf/.d%LaK/DM'E5HπU"kcp'sz4T4L#1ZbZnQ_U]a_9=xG?S1KPk?$+5(%MBtfZ-\FMWncfc6Y2gS3?u+j%πU"+nvL1&1BG4avJHHX2Igai2Fbe\Pq*T:M1,'\.&hq7Y)qlanN=ZDX_#)%Mb:QDOwπU".,9VFi[M0C+f4vh8=)'1V1LNa1Y,''veEV8[kFF7Sf*?GLNFkMZ4VvfD_pv(Z69πU"c'o?oxi5plENr_ken*o'^Fwuf*u27=T?3ro)-;?.X&Jbr_%%7j6nOu#Bg8=?LQ-πU"3uKgZk(U'F2PsM,V'Y21e<x?rYNdN/kq\_ROKNvv2bI>]raI'de^Paft04/(Xp0πU"/D:GJc8vnP1-f<NM.+6(opP,8L;lh+YXeSYH;EI4V5WSWCWW?C1u%*6-7c:]]eEπU"j9\pP.8c[L'Z=Bng=VNd4FSMM)r+3T2ONLL4G(F-n[(7sTI^2M>MK%(dA2(?*YCπU"]wLf[08jBay4(?T;3*I#Mnf92c34hncP4^.h<0bPA/9C[aCq9g7D\&D.'uN#OJkπU"(dk32TKrAC+D38i]2wH=?mIq=e<?[(=dhtMrpia869>nc>/J&6.[k]X]%fUl2[KπU";ZX]^PYq*[+uLV;b=i/<FR>lw[_ihAvYw%<A,Xx,S=HvI;\.dsV(zA?J^Nla'g^πU"GA3sr+)6B24oqf=N_rUh-_Bi,_.E$6Q2G'G'2b)^7pkT9Ijc#6mkW)$O;6W\[alπU".68-%AY??&XpkFr>'1e_ehiW_Gw<n3\(H$Q024tU;r\IDuh1fMiYTDYYBqp1=FeπU"ZjF64vU_]cKxDq+oV<pk<3Nkllv#yn3,:o4,h7#$DjD$VSgE1;u?;*CFhG&0i-_πU"]a0+LB;>V*^Z\?anP8])<36bM8C;g5/(a,;dd3[6Oq_<YBLMCRD[sOcKa-^XmV+πU"[.m<2;NPdtI.-^;?7B:T84EjUIPF#4\CnT==6rO;P7ih,e\l7fE2#bCCM]Wxg5#πU"D(7UKJ;yaTtV(Of?XdVS&oAc,WuodqA;ko28/:\[0M(F;eMV%Rjt81DspIN2_'yπU"\axm-JVz:xNJ9OfM4b>&49Dc?k,%=%N.x;W'BvP9laWzd.Anoe-YbY=F?xVXJM+πU"kx>UmQ(1;>6t9\)pyHIlLGdH^ydSfDXbdu[FMgv7,H'pLvAkAmImA[W3#:kyDe=πU"?fW-kGoyturv?o5&s\vCZ+n)aANh,Nh\8z8t'W'FiW-D#(x*a;KbE+9)<[Fp#UZπU"0MdS$A1J]A9o<8ZtIX?IGRda7xcO92>]M7U2k9qtT'^>xSsJ\IIZ00Mjg>Tm#I&πU"tviI2M<-N*.2M$CdpL;pvd5O26M;F<giwZ^?5DDmt.3((tX8inAxKH*oS./8Ww'πU"c><LN5AbRI).'>vUY4Uae.B,/?T$U;sQ>r2:zAZRjA6>:tZ6?VD-rvR&fM1yX=:πU"t;CXepU=sLKbo3]61tS*iJ$C5MPMezI,cJ4>ImNZLGjWIO$oXgPPXN)^D*f95o/πU"f.Dh6m>si1=<Ndkj(hBEPj.l.2u1+W*w:CHa>WbAg/r[OG?Yh<1-6MGf1S;eSMfπU"g,]66g)7-B'8aej_QnUG7YJ:<Qu)d#WPlmrAP8/g0sM,v_A\+GfqRhtW?gQtO.AπU"rKfK,Zz11unJddnpV^H/2sQB-7:ieYK[NJP=o;GimmY_7QCn?3mgQ\uBB6&J0T2πU"DKpwpg?NTqZWX:m6wkD:nM4(jM&45.h(Fw*EPz5P6X<-:D)&mqlv7LB_D>*o+\&πU"kxi>T1btgBOu%]9xc?ihVell^,lDt8?je_K)X=Hxl_T$^fk$0pgthQNzjlwYVcEπU"lY1+ovxxvVp)\mZ':4b'0q?N2?=;8TM+;3:OvP?[y?Z=2o/$7ATKcI0Jawf'l%fπU"BS+UZnqn&A2obJ\prXlQsr5f*'XslN,*ld>C/z)VYn1HfG?*PLZ>KX7[bKaWopZπU"HUYNd&XBb:WH%/PC0T0o?W8AGjC.t6iJqBHW(5%&[G(:c-b'Xk-o8X+iMEp?I*nπU"V_e0m/ii5%mF_ktq:/P*#?AYg8b?JUq4,ZF[.SsH0%[,,+]\Pmof;1dt$R=Ub/9πU"st9*wIl1=g#[f.]q=O^(0LOIFjH9(a+(]S0VGIGy.L49/P9Spd\z.0MrSDpL\e/πU"plfyP_g/S;*F??g-eZ32xh/]e/n^(<m#&ZeXZ8U$+fpsRz:,]Ycdn6qEU+mmmS<πU"YgB(qZDC4adN?pnWqY*Zr^9rH^.Jt_+_+eCX4lZIS?W\;xAVL2F4ZgnqfU1zXV6πU"U[FKe\]*jR,8_8cQ>U%7n=WUYT.3JvDY$,C)nm37QzM-o<L3gN?:2\3'G]S?3qSπU"tbTu'im4;03)ESzkch%DmJ$I'L9Cm\0+P6s?9KN1DAiS$a90'b*Ss--UV[=Kn82πU"f)b?Dr7BjdIf3uaQmSpG+jpl^0R(^2+r#:#w/4_mIhA])6dFpQ9BpX:fVl.bq2MπU"CXHlo%B(jWbrA4R;v_)X:JLd*sWw*LL-Q)B7%If3qMv%oR01\p<;lI,4)lR\?H>πU"e\42N*n_U(F2K4FY*spxE(L(VlN.J]QVC57<sIkOCVwVAdDsd3\cn,vDHvDa<ViπU"NRvNu3^n*$mSwG'vYpJKt8B;kpbzIJ/q(mxj=plnY,Db$*Uj'vS1I_[V0\fw.T6πU"4nFVq'&<tguB-KbP1'dp+bS07P%oiw7I\nT$GZ$t%*X7B)J$3Ca_3WkL+5aj$D(πU"i2)3e5:[gYgDD;7>H%AJK#>2<8futjT2=t2mfS\^Q]O1ws5fKZZYm):6$[=:lYQπU"FPP[-I[8.,B$nL(n]pTk>x(.$fv\Z\oTboX&V\s?du\)[J:kBT)RNM.c7m41HAgπU"AiFoR[+Q92-$T54Dttxv5ZulPAHbHE=bvxa;il^(Vh2R/vgLPewu8&An*pAnXh1πU"Zvq%xe;28W'F.6*,quFO)zVq*ljLdQ.8sV6KU;le<d$fW/.;2$iSV+dwMu^Q4dmπU"?qdvk#(;DN;aGc<$9$=DcE\Pm15O%dEmIGHZu0^DcD0d<R8Xv8W[fI)[e0.>IUVπU"&z9nZTAjvAlqFW[pufCJ.?'Qg\A5p^ig2I(:]W>xbv(<Qj8o5BV\P*MH0o;0FAnπU"qKh?,Qhvtg>1:lgu)j&1Sr%S'.'<Z,Px(u%p&'9%%9%'[%-%\\OaBD/\6J0[)%%πU"*%-%%.%%%%%%%%%&%%E%%%%%%%%%nsy%wtSy&'yup%&'9%%9%'%I-%/TmaBT./UπU"Oy=R%%u.%%%1%%%%%%%%%&%%E%%%%W)%%%vgfx%lihV%SUUV%up&'%9%9%%'%-%πU"*?XaB/&365&.C%%*nd%%%1%%%%%%%%%&%E%%%%+B%%%vg%fxli%hVSU%UWup%*+πU"%%%%%(%.(%z%.%%^$%%%%%πEND SUBπV2πCLOSE:IF S=206AND B&=Z&THEN?" :) Ok!"ELSE?" :( Bad!πSUB U(A$):FOR A=1TO LEN(A$):C=ASC(MID$(A$,A))-37:IF C<0THEN C=91+C*32πIF K<4THEN K=C+243ELSE?#1,CHR$(C+(K MOD 3)*86);:K=K\3:B&=B&+1πS=(S+C)AND 255:NEXT:LOCATE,1:?STRING$(B&*50\Z&,219);:END SUBπSteven Anthony Morisi          GAME OF NIM                    steve179@ix.netcom.com         10/96 (00:00)          QB, QBasic, PDS        102  3170     NIM.BAS     DECLARE SUB tokens ()πDECLARE SUB cputakes ()π''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''π'Date   : 10/96                                                      'π'Author : Steven A. Morisi                                           'π'E-Mail : steve179@ix.netcom.com                                     'π''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''π'Overview                                                            'π'The game of NIM is played between 2 players                         'π'There are 15 counters to start. On a turn a player must take either 'π'1,2 or 3 counters. The player who takes the last counter loses.     'π'(there are variations where Taking the last counter wins).          'π'This program does NOT use perfect play ( since it was written to    '                                                             π'amuse my kids!) You can find the logic in several books. Try        'π'Martin Gardners Scientific American Compilations                    'π''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''πSCREEN 9  ' 640 x 350πDIM SHARED remaining%πCOLOR 7, 1ππ'Start of game .... 15 tokensπremaining% = 15πdone$ = "NO"πtokensπCOLOR 7, 1ππDO UNTIL done$ = "YES"π   move$ = "NG"π   DO UNTIL move$ = "OK"π      LOCATE 18, 23: PRINT "How many will you remove "π      LOCATE 18, 55: INPUT number%π      IF number% = 1 OR number% = 2 OR number% = 3 THENπ         move$ = "OK"π      ELSEπ         BEEPπ      END IFπ   LOOPπ   remaining% = remaining% - number%π   tokensπ   IF remaining% = 1 THENπ      tokensπ      LOCATE 22, 30: PRINT "You win !"π      done$ = "YES"π   END IFπ   cputakes     'what it says!π   IF remaining% = 1 THENπ      LOCATE 22, 30: PRINT "I win !"π    '''''  FOR i% = 1 TO 10: SOUND 600 + (10 * i%), 1: NEXT i%π      done$ = "YES"π    END IFπLOOPπSLEEPπSYSTEMππSUB cputakesπ'Very rudimentary logic to give it the impression that it is thinkingπtake% = 1πIF remaining% = 3 THEN take% = 2πIF remaining% = 2 THEN take% = 1πIF remaining% = 10 THEN take% = 3πIF remaining% = 7 THEN take% = 1ππFOR cpu% = 1 TO take%π    whichone% = remaining%        'which one to disolveπ    remaining% = remaining% - 1   'reset number remainingππ    z% = 35 + (whichone% * 35)ππ    FOR r% = 1 TO 18π        CIRCLE (z%, 150), r%, 4π        SOUND 400 + (12 * r%), 1π        FOR delay% = 1 TO 30000: NEXT delay%π    NEXT r%ππNEXT cpu%πEND SUBππSUB tokensπCLSπ'TitleπLOCATE 2, 25: PRINT "██   █  ███████   ██   ██ "πLOCATE 3, 25: PRINT "█ █  █     █      █ █ █ █ "πLOCATE 4, 25: PRINT "█  █ █     █      █  █  █ "πLOCATE 5, 25: PRINT "█   ██  ███████   █     █ "ππππ'Paint the playing areaπFOR i% = 1 TO 4πLINE (40 + i%, 100 + i%)-(600 - i%, 200 - i%), 4, BFπNEXT i%π π'Print the remaining tokensπFOR i% = 1 TO remaining%π    x% = 35 + (i% * 35)π    CIRCLE (x%, 150), 15, 15: PAINT (x%, 150), 6, 15πNEXT i%πCOLOR 11πLOCATE 20, 16: PRINT " On each turn you opt to remove 1,2 or 3 tokens      "πLOCATE 21, 16: PRINT " The player who is forced to take the last one loses "ππEND SUBπMatt Zuchowski                 LEGEND OF LITH 2 (RPG GAME)    liphilli@flemingc.on.ca        10-23-96 (16:02)       QB, QBasic, PDS        1767116849   LITH2_11.BASDEFINT A-Z:DIM SHARED K,S,B&,Z&:V1 'Created by PostIt! 7.2πSUB V1:OPEN "O",1,"LITH2_11.ZIP",4^6:Z&=87483:?STRING$(50,177);πU"%up()%9%%%d-%C1J%F1[?Xn,H[%%zp%%%/%%%%if%wfmV%SgfxNNL<Bo[m+grp]πU"axIupJ19e$%<OnYfmPhVo\e;8R*jTYpt/k]#hg24jL#=^e=>^xvv&dIub'C9*r?πU"pRd4#kmt4h444^(p4&Rux%LeirqNt=f-;4$ZKQ$j0*Ni9orwnItSq?+Stv5Ib<nπU"mCr4U>LrQ8G).G[-i$rV_SR1?='BXldQdr&1l(nxTi59n6MLBEL;DDV:cvD=WX7πU"viHU[EoyNBTj,,GRjb3473<XlR>#ME#a,)k5<sV<H.s0fQX$YYsYHCKlb3evJv:πU"'dtNs3ZnsA.<ufWPg?ozQY(zjc]nw6rcNsGu>41bOE77lZ#xu^?jT_jtKNe>Kx_πU"NEl[x,re&9.>Ft'SM9;3GCK]GA15c7?:Uhbb&+^xhOo_S;b>'GMZH/d+^=W_3<GπU"[MpB4_2nbEC(9.3XSZndY.6j'^u+tEsq^NO1$9_%48^Rb]kO1hn[cqNmTj,,GRjπU"bE479iN?clsd(\HjhafIkUw;I]Ms=p-?VmNpY.db:B*zlMtdLqbPG][cQ-MzjW7πU"Ib:K6Es0:UlW):tA'i7>aC=oIddrDM&]mXw]lEJFEiNrx^q3kL.3ijV1ftJ]=+ZπU"WL)&E[u:D_kbJf]mshX1L.dObL$]r>4N/B\QW78n$(5guISO=LS'6F=I[9D:4AEπU"R,B0G+f[Vl+Q,Z:VxclYj*pbkE?uZDt0M>SWH:;LxGu?uRe9><tn]8,,hW>VGDBπU",JOZXTkn?/Kdxyj:]5In*gAo0RuA9GmmRbK?/uwr=2L[,[B].op<PjlA(QB+qVtπU"FFPbT#<cXsP3)$Y]Q#>6DT#V2'Aq7_M5vh2drg%v1X#p\<WN^0#sdn&s;x>Ut22πU"zM?>:tRJ<$M0JuS$ccHu3L=2mr^VN2i)Bb-&Ksa(xk1<.s<9'iN(][L%5[$_EEoπU"1:$ykG5daM-Pp,.5wdNAWaVc<Qo_r-1lhrrhDL4-B>dz^Up(c-NUrry_?+L.C8zπU"S%XHCZ]MktX(RF$P6*FPTA9(OcNW^m+-5dDj/1aFkauY/Xgq-WC4Zq(kz_A+^-NπU"d%TFCqq:%9rcn5g;F*8t-BRlrtCm$$fdJaWrRT-p\J9Usddmt3Mr;9f#V.?1M>uπU"W8'mj7pqq<<mhb[,<D54P+OpVTA^VTVDnRjK^d2x,\5)bBsmk*I87S^q2b)Td7PπU"/'Ks&OSJ>,d)lG*.g:UF)PxI/Ops3Se]\XxGNtex_hrForan]Udiw7qc7ST:BxKπU"Q)0nBQjgPE^S\oG734_WS'aHtl,'(\;S9_K3FA#D]Wm.p3v]N[p56F7=TSVdfutπU"Jbk7N\,ZDWWMTfeua8+B4,-R;p+JF:Md'0tJ2j?I/iganD]n,yK];g7Kx=g]TYUπU"spFtMke?Dmy(qf1gyDW,hVLP3/sx(Ur&dwes6Y&LDKdhG^F\#El2D+C0N[-3:chπU"nIKP(3fP\>XDsOIy27.X4WZ.t=i&e[hK;DWLi##z[T=bqJkK8pEWCX+$3Z.ik-4πU"dPiPKxsp+6'gY&1iR+,l$V)Ddb=b;VGjR7thc/AAAh]%&7d]2x:W[&#lVi3n=/-πU"2=e3w*DqCAu6HEC3xLmiU_crf80id+Tad>zNqVgXlxKg_b;jG$KCGCcumpoTrVjπU"T:k-_r-sBH?%r>d,oIbZ,x=)T$^Lwd(M%FSRuHGEjb&7OX#qvfGtIW#JmC>v72TπU"D?g-u,T3759xVTa+fP8Mv(&%sM?/4kRv-0OJw^7mMBF3TAC$rjTSU&tIBr7OslbπU"w>K%=)s8080Pn];(r)8=?BGUTz8%=G$6ZaZq]%y&eH$:cX/#r[l&0a8x/vUD8*LπU"oU2,RrFru#=IuJg=I+4K?pUmlKH#s9_Q=/kug8C8Bo0IsrM7d_KU_H#=A$>2h$VπU")LvkO4l&jlDD82A%q5bYia]c.3\ic]_uO;F7:M&hD9X(9rd_s_GO[_s'__2e2$AπU"Fe/pAA+#BuNVBM*,c]CFjh,k;7L>tc;yRXX]gl+$7:<;1q'%9Xke+Vk'9(HJeV'πU"l-MkmL%>a1<o7$.)PWfcZcE2AFbe$pwDd)6)bHa.'9x80gVom'gbYJ9-y:Q'Jb_πU"2=eJk'm$fpanqkLOa7rG.-In%j6c6*\#vCRJE)gCx8.S%Fhfm<I;JfOA<).-IFaπU"Iz).7C7FmR.hMUiH];hJoz-K5ag<V^mf2FeJbQ^sGYpIET^eO<QJ^Se<QJ)^kl4πU"9eb<<'a)l0Iu1.O,1?-MXw8c/i87\obc0w469=Uv:;*K/>/32z9QpkwhR?dM\R_πU")#tDKGMUF[]7(&YAi%BaLXN</67T7a)((Y.C+up]%MS0bLzJz3mo4sK9YI%j9-CπU"(;hR]G;eP:#s'\G/VY7MxQ,ul2(reXngd/n6=g:J^VKhqwA>oTEu.t#0M_4XrLCπU";>batJB##Kz9?YL^_g8]a,+Gyu%_LYBL.l*i]C^I$fF1Za6uC+/MCmE181mVZPfπU":_]YsFQ9-A]rMD9jA[)X'B5R\8vQ*9hm?aiGi^^ECK;a,*XRd'-mBRaemCd;(HLπU"2_XsfBoqI\nYs#.[EzK'(*xWVIDmdX/MfyqTm0k1/1c_<j8FP5&g]2<#bBvOr57πU"X^>P5a=0?(HVTj5AZ,X&e0Ah]2s#ol)DA_O8,/OyhmO*-_XSIeo['0)nU07C\SBπU"fRf-G[(,H9JcN1Ze3m9mYV-P7VV-1Rq1fDRq1fDRq1fDRq1fDRq1fDRq1\DgeW[πU"PR&9\D4%>GB.eV-,:u[P&49\D%*>GBe(V-,u,[P&9*\De^+>((MH?d%YKj_O105πU"3o=]((M?fd%Yjg_O15[3Qy?fd%Yjg_O15^3o=(m(M?d:%Yj_;O1538o=((XM?dOπU";82538o=((=M?d%GYj_O,153=>,?d%GYj_OJqRu$ZArm9mYV-P7VV-1Rq1fDRq1πU"fDRq1fDRq1fDRq1fDRq1\DgeW[PR&9\D4%>GB.eV-,:u[P&49\D%*>GBe(V-,u,πU"[P&9*\De^+>((MH?d%YKj_O1053o=]((M?fd%Yjg_O15[3Qy?fd%Yjg_O15^3o=πU"(m(M?d:%Yj_;O1538o=((XM?dO;82538o=((=M?d%GYj_O,153=>,?d%GYj_OeqπU"Ru*OjSv&hrXp6M]Xp4h/17(h217(h217(h217(h217(_21=(d(g35^3o=(m(M?dπU":%Yj_;O1538o=((=M?d%GYj_OG153oa=((C*BGBe(V-,u,[P&9$\D%>&GBeVA-,πU"u[]P&9\2D/pWA-,u[]P&9\SD%>G#BeV-d,u[PR&9\D4%>GB.eV-,Rq#\D4%>GB.πU"eV-,:u[P&j9\D90aW-,:u[P&TMNOfWmX[NBH'8bDCh=ZI'8bC/h=Z'L8bCh(=Z'πU"82bCh=AZ'8fDCP5<d/q;K.*Mj'18jC&rCu9=gK,O+7NU*n1<o;/:q;K*EC8x/)1πU"bSefR9gQ&s0u[[*K[bC'crPSXr3/GpS9g*Qs0u%[*K[0b'cr_PXr3C%4x/)1bSeπU"fR9gQ&s0u[[*K[bC'crPnXr39HaS9g*Qs0u%;*KK'bWV;:*u7j_PXn3Cq[jP8XnπU"3qJ[jPXFn3q[1rPXr03%4x2/1bSFeR9g*Qs0u%[*K[0b'cr_PXr3C%4x/)1bSefπU"R9gQ&s0u[[*K[bC'crP8Xr3%J4x/1\bSeRU9gQs%0u[*7K[b'JcrPXFr3%4Lx/1πU"b.SU<[[*K[bC'crP8Xr3%J4x/1\bSeRL9ggr5Q_mLqBgG=J'9gg$<CK?>q9=A&uπU"XV;7*K_U;lX*MgU#Vb(eW[*+KoUB)o;/q*e0_efR9gQi<CO+RNU*V0b%4x_/14LπU";PAS9YgQ<C,O+NU<*Vb%J4x/1a4L&C>u9=CMuRT91x/14TL&CuH9=CuC(crP&XbπU"q,(Mj'8)Jg3u[[*KoIUBo;R/qe07_eR9YgQ<C2/C</4qe0_Ce(9g5g<CKr?q9=(πU"AuXV[;*K_gUlX*#MUVV0bq[j)PX$q7,g-NjU*VbC%4x/814L&rCu9M].OU*GVb%πU"41x/14TL&CuH9=CuC(crP&Xbq,(Mj'8)Jg3u[[*KoIUBo;R/qe07_eR9YgQ<C,OπU"+NU<*Vb%J4x/1a4L&C>u9=CSu(L51x/14TL&CuH9=CuC(crP&Xbq,(Mj'xBPQUDπU"t=W(7,wahUWsat-)aIzI1x_LROw(L#;8M(t'kBX>Q*'rXk0:7NOf$5DHVc2k-U4πU"sPWx=QCNkSLYc)H6gO1lsIH?4saeqR(AH8dIxQR+lf_6pt*WI6#%([iFjP9A$9FπU"ZDk2=5g3j];SPxSpf12'Ek_\FprxS5<^>sf,NN\>,2uNU;'rbPr*00Xu;;_21PlπU"\)/pq0V\F&uP:Ex&ueMTBJkwSFr*uOHNba(BeUNUQ[>Kl3/kNY9R$x]i>1M<A_8πU"MY_pm*_Q-3nGh<nlEGgjgl>d2k95^#i_RSv_V;>uaJ1=N;u/$T%LD:;H0vq3p*VπU"pqh?R8v-,X\47S.isLY)Ef;uu&I^#9?ZVHk>hNhC^:(]+ql\+*Tr9Zl9(#KgOQ$πU"\1DP^M[=sD&D^jGPd^,PppT1mqG1L%[G?5tRUQO6xFEaZMU;E1ZM?;4iqY4o3JXπU"wem3+Llk6<W=WE77TlcLyveBGR,f$QSr;cK>.oF-VLGhGveqd2TggfUvSrhVQO2πU"S_?nGEb**7;m#TV^[QwQe[aSTpdxs\Aib9KgG:89[GF)9K63TDv0>OvJVj*soJ>πU"1c&9RUB)g$Nt'c(du2bDBC=\eHOEX(R&4MC&91otYbfr_w=AE'hHahXDB-Ai:GBπU"PEqlX]&\5E69WG,PUOv(Q+.W/4h/\%J8K;FFZ/Z,_4A>K:Q</?88rg_pi%gQig4πU"/]7f8tVjV\9wmmK/UN,oX<p<\Q4b_'h]lUG=o:K7K$n^4P%1VaXRf\jiQ6pWpMPπU"*),V6AKlReFQ?w4mK*j5\X/H.nK;HcEV=cXFF=^e]VX5?W*W2LNn8a9m4W4qphQπU"Oqia=/_*x5E/=U2iZ/he5$#SKvMr6[381LtIXYbhlej4/wbWv&#kE$S-:izrHsnπU"h7wb1hnsIYp*(TSg>bjIvRpJaB1nQ9ZF&4ofZtj8T9vDPLNZlOsC0'TkXI'*DaPπU"pS$w4uuGBO$'dOsaU2FF+78[ptYF1\pgbWv2M(8Y.hX0#QFeum3XDXRU*fXx0rSπU"V__Ki.TnyAeMlI=E7#x(K0LmF:hi*2]g^w6Aqhli,fY2KV=[$4I*P,e9=-+?mKZπU"/UNCtX-L^>Bmh7-EsY8,jF6bB7crioX,TO+6.otEp_q;^$2i;Qak(HV8X>v)X<<πU"P\eqd?p?C0/',w?4WKs0Ypa?(R#J7df*HavalX-v3JiVaXffsJY\)Fnh_5%mK6/πU",1RO_UPCnXyH^H,]D_+/rYpp$x$Its80&XPVlvY(S>m-xIJ7^dfrup_bHlP/w99πU"g,$s1RJZje/LrkKS<$DcQo(5h^I<$D0?=EziRp(S894,*+[PH7F/(IVHTF/UNqSπU"511L:eKQ6Vi</<>N2/8KEw5hlW9-;TnS0/fKnjX*jrRHnh1ZwC+iXFVfeDhhllPπU"8_zvHTcE5q5C04eh:amdSa0rW%_V=[$PiKNY(65QTSH+#^I8*Nf&P4lhLsrm^OjπU"72*^>maX*#D#lIGm>Dn-Qj)i8KW/(T=(yrtX-*N.8(u\FrHS/g2/[4B]\^mi5BVπU"y_8TKd_B1Tz(FbhQnVn[K6VYm76j*aIi/lZfuKpnbwW>d++tQlm8e-/sY?c_YYbπU"QVP3wT&U_SSXl]?rWU$#,&,n76Tr-;;KY't5F4j:plaw:.zY^mTgadb6\4YhdmKπU";\e_W6LnvnTGen>dYNu$sF-7dzc_NDG2bzl>mX+\l8TK$0n]]n/_Ss&Fa-&vQ0^πU"BUYb$&%HgPAMXC3'-aJPfRHnsKoVpQmb=FHlRra?mGfE8Mc3s=9ScJ>6D0b:d/hπU"U_LiJTf,Ft$:,7K$6Rvvn]x=$A2L9imlNd*g)HgQ>Vp<2&qrhQB#3-rIlp.OKNeπU"i51OLRDlp-5dXPp+2]9(*lljW*jrdHnNhorPV^qv(SBe;[wHtRTO-,F.pqjX*bRπU"esnNpovm3T+RpH#miWKYYB.kBm,Y*hpCrIVP=.6T^c]K6)bB,2LG\7;ZpRV>&'BπU"I82*4/=PHIsFU7HIs?8p2(in<&33XeNScswjUWdnF-YK*XMs1g^7VB?i-5Ka+\;πU"*qk^f?C]hgLd9s#HNP[6_uEEWol\y.]cw/EvsO=cswEXSl7(<GFl<62,>vLidIBπU"fqJBPnqEA-'=\H7\h>,>#t:?O*kf]C6XIPF*i#-aL<nam?WdI,e<]C6IlddC+k4πU"(b\Y>PBef6s]8e,L*oR_^wEkl-f]bC6IP<cs6IbvdJ28%LfJ^^,TBAD_^;8)pkJπU"S'PBD\2#[&aJr7%td]s*8(pkJn'PB?>i*n+$oz$scoNb)t.VJ0l(gPvWc]7LGDTπU"pAN3-a:>&06IbvdJ2;EDTpPA3-a$d%eDhMD^8qLD0et&pqTV&FDMVD^8L&D4wnrπU"_=1?q\Bn<,Pwqcu7cT<<DE#<cfgDwnvbjTddjtkS-1v=[pb$4Y;/4qpG6GZE$/vπU"H*tuL<dv]fvrJ+CRYJkToZ4D(djzJDP7Ff7&$k8uXj%n8I'I%2n\_0a2II-Gq+fπU"982C'mm_.,aHI1-Gqf'982'&mmuB2GybE*YX+&#tY-G[Gf2YYXwC2*YX+&#tY-GπU"[Gfl9s8r^O+l9821'm75KiiQ]8PLk02s^PL[?)aJ4EYX)\l%t].<vn%#tY-G8qfπU"98#._*m-A(.d1*m75KiiROdL7s7F6EYiIZ?U5hbPpZ23/7_V8':oWLE1/]K>=k6πU"?9_\g?UUVRFr&R2ulRFA>11Hhr07Y=BK]_,7[^=Zk?9_I\?UU]WFr(MRumR(F>1πU"1MHr079iBK):$7k^s=k?9A_\?U,UXFrN*Run/RF>1L1Hr0]a%AK7I$a'm]=k?*9πU"_\?;U]9Fjr,R'DORF>I11Hr,0a5A0Sirp<Y/A#7(hWmhgZM:RJr-ZMMPR0?iC9UπU"hKt0a^<+_msk89:A_\+U?5J)go9t#bMT_nP(F>11MHr07;J,K1337J^s=k?9A_\πU"?Uc/PJFVoZ/f/RF>1L1Hr0h7J,KO137Jm^=k?*9_\?>U/PJiFoZ/DfRF>I11HrDπU"07+,TK137:+,SGSp>]/#])+U*5$U4EFol)7I4FEO,<Kh;P0?qH<I1InsjkI^1AUπU"]D\PF>sY%)#(e>29&E>==Zk?9_I\?U5BIHRaMV5_R(F>11MHr077+bKG)H7+^s=πU"k?9A_\?UV5_r4.RYRAL1H2/'A#2hXXAum(<if3,U5VUN]\U0X-CuY1=UoAL1H2/πU"'A#2hTTpxEVhV/f/RF>1L1H2M7U2p).nX'lZTD:?h._PZ'GE2h$T*LF//B<T7,hπU"W=a=kk<IU)4M%B3hu:3U5VOU]\UMp./M8b3v'7,hW=a=kk<rIUI8)S&l#6;:_\:πU"+U5VOd8VJHJm;AJ0\iP*ZMY(0<B8?kUo\rTNd->IA1H2,/A#2=htOE[rr(f[#,hπU"WR==kEJ9AXJqKiD>Yql3gO)3]Dp[d:5dZ.uZ>Lg03mznODuxOZft(,hh3fFRlW2πU"FizXu.+VjEs&uCd[VdGKL87D)()b$*WY5iqvj/l'FAUch3?Pu27O$$U;O*e9a*OπU"8hX7tt$h<<ahJ;\HBquWXtZ,G(1-jURCPrhghE:QKmvY/.Fw00jRfgA0YFWe5)'πU"Rr:dVZ<$j(s<-RvgiMpGc#9D4(^D84r,A;?*.4K,JV;Xy[Zc_pFqmOjmiW5g71dπU"x4jWYTl4Xk[]'.qkZb]UsyZ*KHvu.Wb&O7fN_>#aEfJGO_vMEQFH5yuGvBm;zkxπU"F_.N78m.\J^_;i8cdJ8</Nxv?w$o:PTh[u''DdYweS/S>3%K'V4o<ljk%U>b9YvπU")1%hQvv1R4bjnHN]n$J\^8i?CpeF2k[3w<i5NFkl6LxcY(nmY^vGPfKQ2VUJ3M+πU"qEanVug?\XiD3p>H2;y321(al1*#wdCHnzNMh-w:68TY.1wSv:*J[D?OX$5%M;?πU"lL76w+$Z67j>';P[sY^7'=esW+CFYvwB]TnC%B_kQs2K+Wv^UL9:P;5EaDn3UabπU"FHxj^WXC;o$mHlE[8Wn^iVnL7WcVr$Rkp&)\Z,^]vO<[e=WlCZ*g4k*F?_;BC?RπU"cgRJ$L)xI2i19Kmo_BS*LqxW#IHjlGIN&YJD\9giZSr9Z;,lbyW5/x?*'1;PE?LπU"x:f9ijc&Tv#'OSwwM'G^O)FUNR]GXrK\TJ[Scg=d=\p(20T1mDZj4c$bYH-qkfJπU")H.=+C11ZS]N%[*DTB>[[Ci97=)ljg1PJqhWd;Z;7A(8IJ5uza,m6hF_iZZsT0-πU"<h<K%^+Pr$HK.b4n:L^[%Yfs<^d5z%Ye8Kz;;+0.e<OGw&,ld3NgO4'>MY-rF1)πU"obXwf80F6A**N6g8$ne'eYw$_a^sKRc\Nz643PumROu%MuC+a,]4VBV^s\<^qvsπU"KDx>qvjfK8QlLR7/4oPS33G507RCq^lW+I&H6q-ErnWnE+<1jE<.*h88&v>[F9(πU"x00eHNRb23EN8_y;GL/zQEp-eLoMm#4/k\zuBuNmzwWbVqg%Npbi$&T;tzS[h6kπU"A.K04FpO=O<$TkZbaC]OajJpQhNY&j[4V8xeTrj,3>ZkP=VW+sM2TxKuCToT&TAπU"L':S(XPX5^d23c)_VNf)]A.\C>lfWjE,0jAFF)Q3G7p^&PESU7wl8cxVKVIgAHjπU"sxCLTD#>b6sxZmOsN3K4K(N<iRm$;0ux+*)Nx0bMSs<A:,v$]lH#<8HV65dGFhWπU"LNCp^1W)h/55/nv?a==B((Oa8[g)MTWfCi6,A$4uYTLFkuKYF(MmGxtk0buZgW&πU"R$Tou#&Zk*jLo#E<6uS>#>i[8BIGP4)G]*X\9bM+CS,&Z,d;iZl)[X*pB]%KFV-πU"N$rVuFGYIL\_(Idf(O#I1HEcci_&bxoq96+SjdDEaSTS0T\76e&:f$wCgb/'d1BπU"Mq]Yp/7V42H<C[8f+:*bRjriw;N(fy13Bfx5m<>n38A1U\l]_LvrS'68sX>uWMeπU".jFWlW:)T.<cxqIijoo>o^c>5T[=W7x+lJF1#VX-><is<#VXUahClEMXW<DhFgCπU"NiP,t=L70,SKJwuTIeL=.5[Xe\1Nq%YtZ*UkH_OYZt#Vk_0OYZV?Wk_;jY8DZZvπU"t=O;j?&r>NFA]JA7q1PaE]sgCrCQn$o:N4?MruTtDZl5M852[?P;?N6b0BGED*NπU"2'=mWNTgQ\YcHr.*0..$XG_$>Pd^Mv)JCy:5]dwR]Hmc'/EaFR$J%=GX$ZaZCA>πU"B1.q;1A#xvCBAyNBa)#Lv+(\ITc:5.]KD-e2gh%:se8biDt#HR,]WC3g'9xSc^MπU"vw),%dnOz$)_uU5/%FSp;b*E02O%gOnue;\5K#I_PG1gdLHd%Pd$*F$ZKI>I<NnπU"a(/S=r1hd09Zl&;U*D6^/jy3ukAZvUjeTvq^tbaiik?lH*\l2JPe\\K.J+:FZZ^πU"W&\ZcF^1i+WQR%mrh$Ws(hwds7r0Xk)Z7cmu9EfM;c;atM[lCGio#.Dk:)<tqCrπU"n#<([.JKo<.o\Knug%RB%?*XVMd$mbft5E-b;_IrX%VV3^[(a=IbLnqKd,.t.W)πU"(=\gQ'UD''R\Zd'iJl6d-+s=S,(*:CWc/nqtOCh=WD.\V=FT>gr*Y,X3&P+]VbtπU"gmoeTb^CWY.X=;tDul:QW71I'(Os3K=TqAL=bxWrlg&dETPWnQF7GfV5$<-U$5YπU"l[xrwLeyo7(;=aPprnyxbR$<hy/qdWT>)$jdrx2u//H6.ZtJj8GVnlqNb&w:>P&πU"jbzVZn)R6M\%XSNxFh2$gI]jBDh3W?EV3OQ6/sq-iLBcvevG5qqI><c&>uR+tsqπU"^^N1$*j:7X9fF*Pe4Bk6?m;FSQ5eqm&,Y/r2Dg*r4'L97gp%biE(ii;oQERCN%uπU"*$$NCP*Di=*%HL&a;iN$.^(YM_C%^HJRlncu(k-s)x#NNw-6pvCK&<:pN_U%P.ZπU"1I:''%8$Lr;sc)#E[Y5APs_dK.2Su&r/hw$E1oXEP^S\&?U4C^/pzU0vtj+X*bkπU"MX.-Dom]ofJM'Fh)5r^1tLcsKlG_eOEkftHDffaLtue+00MNA/c5O[6B4^4^CQ[πU"$vX:N*7dLNQM*,5EpyMI$=]*bkiRFvnI>8K7QfYUBh^B6t*pk$8YwXrlE.A#4jvπU"M[$g*kdBF.H/^l%QYef[#Xh3]Yf;v^Hf:wK#.)N5I(o-NnXFAGpwG]QjtKp)PRGπU"VohhM,C9b82KiS,.=ZedHbWxLXz/lyTx&zDyjB&OckT$YFz>Y]<1mprt<oxIG'lπU"('iV8%d8oV1)GXJPyJN7GC#eUznm-PlbB^d/RIcQlb(Zi2M2-m]S-1JLw>MU<&ZπU"&sNg;2Yy(^*Jk;)k7$VufLsn/LJ3pz%k;ZuT30zlnDrTx;BZN:H=-_:M;aBjM,6πU"Hk060QqCT0u:PcoDj'/Y#5noa9E$<ZZ+hXOYNuKeJkNON0-rR,^sqPqTTc.O)jbπU"Fdcaq>)a.5MY\QvCjYzt6B>7Cpsvs?fS=&N?X<4$63+<Y:RkEn?Ffezm2yF+nG1πU"$RrZkF<h2%uFBbG9U5CM$RmB&'V*5lpR;LLWjQF0a\Yc,<N5nJLo/a0$KL?X)YoπU"inh-K(>,sErZK^T+O]&%^8T4#ObvRM,&UM2arg\l6:rG)NTot^<0zu-plGO3PgVπU"n/AQ3Q:<b2AtZ4$RdmVz][yR4WjH>-OGMj9[GsqA3r>ikS&f^BvFM_wdrHbr)\gπU"30T2iLdkR9iHZtaa_f2jmNJlosR_qoLooP\W#PX1u3f3Ua2:dVAZ:r.?Lj&sHqDπU"1TVh2gYD$gDxEQ,Hx\ERi7Lruk4Uj[CeNt-KqFk^3^K$#'XvzAl><BMeTx:=K<$πU"]Vnf(=\2>7OW6S.r=;o=^6Nnyw:VSeI#2$S)OU?o%GBfI+kCIOaunmU[N%s>kasπU"TZ=Lqul]=/B8%aG<Dn%)kS<tNT=UfH3Sfyo>M0'Tv3>[4O0lO%mh$?SY#NR_BqVπU"ST.5ewZtG*U_7.gk'\CZWnU7bM]d*og7vb\M8$t6vc]Abk(We7.*N^-g,=?xGbrπU"sVH6LJYL%gm.tA\:tc/c7m?(Pm-V#JaZ%Lapk=_i9JeE4)Vag:Ik4$hGLEp(DX&πU"7<D1lDvtt]\At/D$%/;skfFmXMQCDdOcdS(-^IOz-GTYZ]KQ[er'1<e,p01AsZBπU"U<kI74^1QKK/U;ZpThg<X165:VPKS[D6('*eCI#b-hdbCfn;G4I^=VaqD#rgL4kπU"Su^h1Us+7T3UbkteJ2AAbnYJUnvl60#EsCilc/?f.Y&-m7<ol?2l,3RLy)z\E6fπU"V,/t_zL[L&<QBA8_rek-St&BVo6\7rATEv&%'Ds?LP?6VtLwx1TQn3&Y2(M]E<0πU"t'4GU6<R,/jJp_RXXLLpeA6rYr9rGNi20p^'c_HlX7epc,foF0ZtR_vTA8^x8mtπU"lChtVA.LC-$UE,fTG/mZX]m=>C^wvZ3DU_#kpX:ouv%XmbeCCnW=/lt.YQSpS/]πU"Z=%Ow]Q-w8Lwd5CzIEg5/,90zaH^0TcVT&g4E1/lL6?Vx#/5\;t9Si6guaG.wa#πU"DFw-,px,u%p()9%%%%-X%n/%#F14X*lO%%+%6%%%%-%%%%rfy%ySxf8%XKV-+IVπU"+Da5EUhXP]*h]h]*^V_WM+VKV*<kH21AD1e_8fpB\**sin+lBLX+L,I(BA%G2)RπU"/E>2k$.yJq5+m_.c']X^$]fJ3MStC;R9VQ$$vsB_N)6V3u_s#M&2P*aRGQ<uoM9πU"YT)EaK=ACXkc=q=#1hJW8:eg&%%up(%)9%%#%-%=_MVE<ubmiX%%%%$%+%%,%%%πU"%q%yVSiRlnNc9V2;U(1SHdT)&&17X+<UUoUYP(Rh'.ixac/eWE_CStiFv#_^s%5πU"=PBoH#VJl-K1V2YjPw6)Qhm*SVO<OOW2_V(8a7JLMSQo?A7*B7N-J?+FCGTF[&^πU";/<'iNu0r)AiN'<CS5fM5PkYSwem?uWdF^S*M4.yiAziPdT3NQ29xEEzkVj\Kh(πU"UB+Y_lPar0kT]4Z^75^d:gY3<k.Iknta#;un6ZV9*IskJBrh4m.c+2c[h.Cx(<-πU"0DE/I)^[j24(xKSnA,Q4Q8b+mq=X$nba?dM%Bup(%)9%%[%-%;)MVE1O4Mkr%%%πU"%P%)%%,%%%%q%yWSiRln>a9D2;eI1iLoX)kjmCNYH4f1-9S2Rjp/pI55*%[,G&XπU"w;T\pb]]JXiCl#O<2k=MAd86B?(>Ec_5fV?K.kjh,CviNiqgi,8*>zd:h7N^^O+πU"/.'PK'XqU\aDt=8C31$un?s6jQcbD=VKD;.)rjE(mKvK6K)9GiW7p4tYGj/a;thπU"#T3KLPiz]4;,c%P+A[hQiac6$x0ab_bt5%%up(%)9%%%%-%0_NVE4K7^>8[%%%DπU"%'%%,%%%%q%yXSiRln&$0V2OEC1S#&15]DAi<pkcB[Ss021*z4cw=iqFEUhB7RAπU"dW>XEVE_rcoI_W+ns+nx'(2Nsm)h'g8,Oyl(6=):vC/FDpZ)+L-Dr-v/OHve,LTπU"'j]IEMbRRmFDh%?F0Nd5f?;u%p()9%%%%-I%UYVIE/9d-1m%%%%$+%%%,%%%%wyπU"V%Siln<NbF6AQU5TShbQP4URt15Z*cRN;R,)8TXgT.V']]4Ci4.$]bIHj\ZM4YCπU"Vb?ufGV)sXn4Pq#b12OzAI(e>\$pc&A)E(H^wg.ejO%BwMg8.fmMHD%Qo3Ay6>qπEND SUBπSUB V2πU"(8W:N+.J?FgOygeqQhcT^)r.IprTFB,qE30&9o<pJ1[BVdEiDP+Yn.NaNEJPgaVπU",pF1NS(/hf*9H5uDsc2cUXRV_D?ds;Awk(kmlPBkeAUC_QzjFi4G_>aTT>a#)pIπU"UB\I^Qw^649J>m+Z8F(,+)-6hy2e*=[v7uOpT+Lu(>W,7dy618RR9*12Nw,%up(πU")%9%%%I-%RY/VE/\1=Sr%%%%P)%%%,%%%%wy%WSil4n>$p+3;U1=i,Y-QIO-BCMπU"eA2j3:h5*i4]*L7mK7M_'sZ)evO>>zkLm&HbDNS,tpC=plGqU,ARh9lUo^_G*idπU"%uzCu%x()UE>15$d=IA=%J8^e;VA(7O8qb:CRfNA3/$anQlv?9ul?7%%SyTziu%πU"&lY=bBiN>$jp7^USrdoD-&M^fDv^P.SgJqCWFTMLe1sCs$v.?kg3G3w8>%up()%πU"9%%%R-%CYAVE(A128=%7%%D'%%%,%%%%wy%XSiljn&$D(.OU5CiRR7OKf'U(j(xπU"3PR6'T*Y38*.dEgaQ;g0gNv4*6N$e=CJb0doj67aZOLvd74F?m*/*w$%%(bxT;4πU"NcQhV/m\fbHsZ9ghjfdZz)hfV4)XSCGDVl'JBEri:HSut/s$*IgBu%p()9%%%%-πU"I%>[V:E,t7(%E'%+%,:%%%,%%(%&fV%SilnWf&f\'TU1rKX3fR7N4Ov[Yilbq-,πU"Zw:9wqrBRn3TMR:Pge]A$[nrBlVtbhp(pDfDHi0^>XjThv6)s,t$ufhffqn*0ZfπU"$,HTL)TE\Qhdg&jv[CDr$Y<-T+Ae'pBlD);kiu)Y*P.2k[m%m-?lK[9_-0\&(?.πU"_T^Z%l&O6?he+QLqZ=Wq[ZA;Dk1(X:eJKs3G\bgH0N.d&XL4ak$LRxsME;XHK^^πU"1AmM=p?Q0;Rj9D;Wj:6bcOXjqYIlmyq''UXZ-a]IAC/8PtR\HYf-KNQY8D09L:#πU"SN/Ygi&8D'>P/*N<Y^3nQ#.N1C;a39^4$RmAO^Jj'TT1e#5ewX^a#6[%5^a.=HiπU"1Pd9]HT_\=iB,uu:x9x5ufRWkbj<fRmBS<40jYNIiOg,,5q&]d$]:BUXJ3XmMXZπU"xM:#rO<a/aJTHkr2+9SD4A&d2RofPC2+Sadr+&w7^AkIDcWF<)p--^ELU,&Ov']πU"ssO2qJ<%DSV\&OCWjT$fW]dAE(hD.<)uN32\Tqi%=sN\,.6g>tW?Q_]xO/$5&-RπU"c)mJxY=hRy/l/Vj,V8#8VptdCRsKN^*taqKvn8%:wo;i*AGrS#5oqT)trVtH\&vπU"Twi%5]scjd)-)O6hJrA'PTOd<nhq$[]>Q\V]3X<&VZKX&h\<d'$w5*q-&Q(t?3:πU"pzj8hInV\+=*1Jt)FGd*otr2B<jN.1t>rN3(T/A;GLp#l,tA,]D_Iqp6*>ejjVVπU"+mbXWV'$d)rEBlW$NbItK^0Gf4T9=>uVw:P[B3)Er)/.6.KD06T\>;uuhevu-L7πU"U'w%up%()9%%%%-%3)[VEIgQGK%Z&%%&B2%%%,%%%&&fWS[ilnf,dXr(RV1?^C&πU"GP<Ben=T7F=9h^UbD5[1xEZLd#A?&V-Lz[Rwc.0jT]tQ6Hf+XdWXeu^njr<Z42qπU"jBKHc2iIi_ksL\=-onFgIIsLWMQ'4n_54s2MLUS[*Asv(%W8+E8ar23.meSy'QGπU"&#U>Q_WGPQ.O%%'_>XM*#)&%y/z.d7\.*vur2<oxaR8V4AP]f\Qb_3UMD'usRgnπU"ezs_sReO>>50__rfs7KOT6?\1[3o<-o&B%TS5=B=s\F\fn3sV65-D%S9dP,Er2TπU"=f1hwtcGVeFb3T=-]L0o\TdBk.(CLd5qzrJH-<oee#d\%1([Cu5(TB;JY$AT'\sπU"-oJ/kg#wroH)R(:n3muXK[h0cAtffFnj?5Qm+K^PXAsGf1Tlkv'xD9MBa8%up()πU"%9%%%R-%m[\VEX60wOI%7%%l,%%%,%.%%&f%XSil4n^aV(3OE14j4H%)8JZ43^PπU"k#?h[[:(qS'v%13=,TI\iec_l#Qee6/f.K=O#,T7*[hYxl7eW^^]rJ^aH(M6FF.πU";a3Lj*nX&RtwX5Pv:-CCnWf4^*<VJA5O/eR\/+*thu_ZX?0x*?6LUlB6rZ/trI0πU"Y,.)(u%p()9%%%%-U%?.%RF;Ko)^Q:%1%EA%%%,%%%%jsV%SgfxT^btBoS]08S6πU"KxRWCu03Vf5*\qHsVWbpY5gc#d'RGuXTFJ+uQvU35)8u0xvN2$3*4I#AaE3pj5KπU">'A$AOn$trILx6W-G3DlWf08B8IWx]t#I=nn#9Zr'02cbGh[J90HuNYqFIGmrmsπU"0>nGR^5ipF'C/?k,)\Sst3Us6Img_7El1cuIV]<6O(C$PD;V.%Iu-870%8*Mma4πU"#*FQr[d4=$:]EhPHX.:?(Xtfl)MA4t-1jVb>v*GVJD^<ZR4GGd]A^IEei%Cmv=eπU"Osp\%;g75k)0[i\Iq5_)\%ibsYM1g5kY7>([29k4=LnmhsVOI-*b2\q&Is<by?7πU"]1e;2RjwtR3?'^tOCU]8C[]p^Cx3_m_Lva=;lhR<wMkjI3&]H<2J.KTba9stB#YπU"TH&r+c\8Gx8ZtW18JTN'%;PAk1+Pq.JbI5mfx*>xhTpAptP8=doHI&[,\U,q/9bπU"D<ii?LhkMvOPI6n>QWIZ5/gra.*E4p.FKt5;p\$P4teIPVgc60%o*JS>LB%]vZ4πU"8/Uo7M#%%\bbQoPw*V]$I^U>uiAL]CtZd:iux2roq0oBZT^;'X%0Y8Wkv>n(Z\nπU"Dt+XX1m#1oK8BDiplIPzwq7]S(oxrKvA01^#PL>es<Pj'#H2^Oih^$8T^:3eC#_πU"dbh2Du]XCgUJPTpDUJ_+ue&P9.I-+fG?d)K2^;oD>3Zn6F\mG3SCDu#<w87BYh4πU"N:\_y;qhLh_NodTCxaMBZ+$$flav/U<gqKLYFjr15HhdO.%XhtUxgLbHBFAd&\kπU"*Z^m#Y8AQKX6hMIA^HV(G)>tDL8E='hYXVZDV?dw9fZvJ8kq^6af#$yO,Sq4Gw=πU"0h'aC'4ey?4>g(0rwTTGb90RkDk<I$wWo0aJm#(iL(hTop^5w8.'PD?FDLvj<vYπU"e&B'kN=GM87JCDyRZ_PGW+GM8-<q5)<'6V]Bic^67*pOJ=gxSh[Jt30XX5Y<D__πU"i-KPD0nDC5*)htLWr7cm3S6G-2pQRr>X-W(RVIR&[D3#eF_cNFR#vCbF5W<G1MKπU"mxuSK#E-cr8/<6eAt\qtTGiquF/hk$c4qA71e(NJ0',lz9YR)uAXN3rM/Z6$a#fπU"gALC>fGU#Z0\r\c\?bx'<?HBGSP,Cuihi9\IdctqP(3)8y:k]d%7g_Vyvh-mmhfπU"OgTZQJghap/dT65f]0yfHffS$Y1&E-JYms7/l7ISQ'AF(1PoPM=>yf73(JE,w>UπU"+Vm$(RUsJ_kkdtrB6Fu[>dFL_;bcgo*XsE#_:DS1r$^c*5p:P$TY>LVi1.YK:hsπU"FI;BWvNa9$_&dVpfM%8oj.Le[05QB_Jl/8y*^437TmP4zQ,l#nJwd/TWB1YjI\>πU"->kJ_]-cpSbmL8wOk,YsD(q/8m[gt>L\wSq3&VfMj/IE01knEvnyg2_5A$Ic2--πU"oaeBvk\gDa>E-Z,II5c>Jv:*Y4';UT7*K4R)_^4a3gP_4OmKxw;uq=3^om^Rep-πU"kiA_unXDP?$QnpXla+sa?%.-;#()4Z3WLg.G0EJW;QlgX)I)SYR+Rsa%*'LB)2yπU"TDa0JWP;F1;E;nvOP%U.<aMN5rfqSI:-vHCB-A%BgRUCa.$BMu0KF[P17SZPq.vπU"+r*:s9S8nF$:P>SL2/<n0^koa&9I7W%6g5.6?*a+-0jPM4h;J#=a9j8QT42-/.YπU"CFYoZ-X(z.+mBMv5-io9)A/iFV9S\2Ba]X?Rr&PsL^ll[+0XX5RR&Jqa^vj:CW:πU"'9Y\_)OXm=gItptBHaOQ;)D<iX.-fOpQtHwu;\zJf>VBJi+0N9dx7\qY:CzyfNWπU"]o+0]R5q7US*N5m*>NS&H*zPZavNm<QP>(*>JGMHKM9h#+BV$HZ]JICpY<7V[QAπU"(=,4t:Fz/.g:cK7KUuasdC;o2#Q(]A>Q\q#n#q&n%mx*2W4b1:*,w''2OaXZ%#/πU"yhTicMD0;9H/+\SD'.Ua\K;c,nG%Fe*;F>tGQoa_\ni\d/eb8w8peO8,7Z?PpJoπU"SQ#o-C'3>ARm?v]:q56EB*J&4DsNj4kX?HG__O4i6bd:OXUqu\:vZ6]rBH##6U%πU"$1>a^I&3BGYKTgS=;#yUk5<.)6ijH$EG9k*8*RCtk*X\,wwnVo8Ic8K#IR=&5M4πU"-u)'+\%/W/[AGBI_\;(*109gPGHCEl(X,eZ/Wsm09wu6uedB>ApUjWNH^]'K1XJπU"qM6/RUN[mPfTsi$oP\+Pnf(IfC[2OC[AuKuf(,zw4IevaP\?;3:S/IXt[htw4JpπU"<UG&hir)&Yx^)8u:HO_uJdJix<'Hc=NM#aQfXW[R<W(f-($R=MMczP%.-XKn/L[πU"I\JmL;o-(/G%ez)l,\+9il'8)FkJ/vLHEQN'IoJkP=-7QL719aI]pdfFOq1A?6nπU"6W8-dS.Wi_]X:sOF6^9F'5]Mgs9HGl&h0j<o5F/2mq4'T(y%w8Q5/*9[S,Y?<*1πU"H[QV+kZMh6-YWl3&H-M[ZkZQHxB>F6$j_Y8VhOtKHF>pjWa$wE5GY;[a^AgT3ULπU"m[#4hJ-$aZOm$U6xOPcm:X'p[Pl$w-3XCpKl*o/EQrD#%U6Bx+j]4pkRKt0=3[:πU"1hmerp]=g6>=Z&K*US&Ka=t[v*>o1H1d9Frpn+)?>XK_/u]mi;WD.bH*fK32rJAπU";T7^j$az<&'ot^WR;%K,o)R6ZSDEXf=Yj[u5kY+tdm3K7?_1j1FSBw)fkF'lL>%πU"89-wa%E0bBZth)MSR7o[#9Z?oYTLU>C?b=O47-k2M9%JXz<iXJ=oFK=p4,E*mh/πU"b]$y#\iSlOs]BXjQmZ$=LRlZ9lk[U*Qw;Cp(Zl5/\q6-]<tMai4^=8eV-SBuGD\πU"_:qtIu)gP:u/3^:P44sgv9gvKfA-$Ln0&XX05QsgSZH^.gcDd5eDAjul3F.ub4-πU"%3r3>Ms(3<.%-t/-LeIHB*q$EKZ*?YS\WEYB8Y1\rl+$V)gT<5v,Mcap_>>+WJ/πU"mMmbkX$iB,+TJ(9m6CmoW#^NS,>*6V&zmRm.Y,TGYJ(E0,73I37Ujd^fKy/s7(OπU"Pk/>vlzCXNzau7[l_H2_kP8gYpr[o?z>WWkRk<S*p/gaBJsXWTUGSK6TkX;%gXIπU"=)\pM)Cc0btV,0tX8JNt.,J-nwH)BP3uTXplk]KfmmhPh_lL3Z/&&Z>jR6(qj/IπU"Psw+:rVss7ASb2G&:\c^JIB[F$%y\\vbdnZiu%RD5oJrwqB?5k'Dhr#6'Qpk\LIπU",GCPbQX/1F#+B',NFvUr*$;'V5Lq]J[c*o6w;7[LDA9lxrU5]pN+DPs:F/0bi3?πU":.'K$5(5F'fc:_3<oU[ylIfG3lP(gEH(E+]CX0GGOg\npEbV?-J:z_8G5/aHmJ\πU"6$sI6rd3+0&Pqw4#v;Ip'x[?_zoS^-qoUVJ]CYp2=CkGmnYI<:fD]ITcK8>bKP1πU";DB%BT0/Ii$+nqc1YI#PR?$<fZV*SC#>N9s-,otgZ_DTlH*.asLcS[%Uv8qZ5W?πU"mJKqK'))szFLL(3(W^v]Hfe_Y=d81%W^_h$RDhGPm;G[M[]5w<tM6MGLO9H-?P;πU"A$^7=Fwi6S:Ui>J#/l.3z]BcTwAED^DT6*TmA;'_r3>^+ZOl^\Y+dct&#fMKf=4πU")KPc+j$-A8lY<B'gpKVVd-Tt.A:^O:nx]p'<05\x\v\FY_?Q*20dJ3]f08#;r+yπU"[[f8[Gd6ZnQ#bHh<m:,Ku+i-w8Xdg3Kw/uw:CGY_-e+%W_)cWtJ#4dw^ahmy%L7πU"2CK#IXB8,dpT9kRq,Iz6N=O5pl]hv*^t8>8Ljl-i=n-]fsWO1\ArE'%Lxc>]<GtπU"jf=(VIHpN_X#)_PFg#lm==j>,k-em3$R<gfQ+B\vWIQZruP5Q#Uk/&9RPJvT71TπU";RcAI<X8s;fgg[M'AW,rnTFJ6UBS+\e=DMJFG.Q%8*K;MP_P8[UQ&h)=RFd+128πU"Kth.OYMgjZ%(2)NI*6?k$CPN>(d)5NhJ(48:D6P-TL7+G<t7GWaxr4Z-e.<f5',πU"]5ays$cFSeRS%X*UA0XePT,]^Up+Mur[*S#<:6$+e/H4bXgXK&TATjMmaWUra(YπU"hm%rcbNWbNN]u6>6K,DmtTPd3$nxUW>]_G,\wcoXP%-yf'F2Zfn\81(w7*zM8?AπU"1cco<m=3o'uilVB8ConbO4(%u1S<pI10empRGT/q+HeENG#r+\zF71=01u?*+B0πU"q.+\cV*(cDYZ2-g[W0p*>AY,D2W2F:5NRC\)7Gdx*>B6Y&U)TWw:bQ>mgbs22oKπU"M=0U0sME-]I+=i7R2j/5Lx=RpbXPu]P:Re[8pnQuCi+X4Jp>i_m2jC.,uEOND73πU"=Y>of3w/UK9hPd.p/,7K[95#P*//FZP#,Y=#2\t1r_euOBQI3Ihj(KCx6<30T/VπU"Y=IY3M\uG[ix84;xWVYFr>47\A\zL>=Q+TRUZ:jVyHP9^o*YB2jyX#b9>YJqjYaπU"f&yG<xkb6xCE7=O<NJS>yN;>(1Q>W4ouUW;UB?WB-flhw;nS'llWkpKL0#'bZ5YπU"f=BjGpztLrXV_o)e&hl$E-5teG4L#'*?fZB:u'+VRB:WiAaCS27bA&a)V=)N_EMπU"lnGD4gdQh--&4WSFc2FxFM\VjWwp5ZoHZ#p/%eFu(rQ*/YB,ZG2e[6NMGU$V,'4πU"ye*F9zGgjDM/6:7nCO&Ep4,z-Qx;u4$ETOz=iRRHOB#5#O12,xLH4,*xGC[)W1RπU"X,*t+G/?W\1P,JhwygI0vnwq7mN($34K-#eUQ#OgxYA-)yHW\%9RXy(ZRsX:4&JπU"Y[hzZaOcl?:(/=r:r48_[oS/'&][[#2$1D*0$'izVUy'X.W]B7p1u:w_Y7]0q,xπU"Y[zrU%7M/)/=pFzZk=$25zj%Pzz<;p*Gh8%yFygz\EI5HAylLxD\EWNHAYi+hy+πU"KJs*eBUIb(&djvv%fxzf<Sv$FIP_7yd_mJp(a3j.#rz.8gdnV%iakxcsAfjl/_:πU"tXgZtR7dd4(J7_xL_/W'36*ETHMI>I>>D4aYIBYheP1Uj-[k;'gvSz=\,.Wtzf'πU"<:c?E-l,<n6fPl2o\9Z0Xk=[Df^=BW,Ct5]h[:d$9Qg+bMYS8N98NIKB+k?_RiDπU"Q]=2zG/(T6fa9U&=W]hGlJlo$(=p8)&P9]2FW4U3_)YSe&ku'SQLq.CWNJ(H>muπU"N7YOf%TK3rOIJRfK5?cZ9u2&UE8c$66e2AKE8)$3)e8&AE8l]7uE\Ju&UdLGwv<πU";'3GyEnVB$0'Cq39N_[UauxO.u*PM?QWCzU<scOdg_M>Xt+g2&eO4B+9o2C#k?>πU"d%S3(f*2WzGRc_I7qLyP/Gq(^pc7gME53Y)ud*a6+gBVm6i95)Q\fq,14/;ZSK(πU"DK3N$Npmn,L?3l'tWcX.6DdEbhhT.B<8?E;d2,#HxA$m>oQey=HDJkhG(VXSMapπU"<T4%p<1&p(Rr;L\#5?XM_Epbx$ZH?t[pk6l77vil#N#9MUs/]agFv5\nshlLLSpπU"t_M$&)el&:'X##j9^Z<tJ>z6Qhgt-[wXMi7GSpZR18f8hGpDlhnnPfhaXtuHZn>πU"H,Et5$8,RYGIe1=6gP4&epzSvaR\DfqIuGu&5__bGX0u.tY4%\q<M%i3cpzrE8:πU"mz,+=qHH2:1,:o3Epq<S.mZik[Q2<UaT_:%gFphfw)9)VkG4DlwVNV,EhVH5Y$>πU"FFgd*Bf-O<2znwS=%T\jhXcKgbkCCc?br[R-?/KXJR,H>aVgJ-PKCa%a6g>#t$aπU"#(t8AaXbJ%oN3$LIpGMn1'L8V<6\T;:4C;-LVdR.cGR_dWYRT8hkRB<8#/0F.$\πU"0X^S0rY0rf>_ZPv8hV<BDA/d4F.\FF8'UXW*7^PXI?XGp_42Qak>5FM6a)80KF8πU"9rM3i9JL/wLki^0>sg_h+MkmdP.1x?=6/Kya[&G1r'eIOb)L;.hu8sFS</F<kuFπU"4ir<-3s+lpyd>;Y'w2)e'FXV8iXJp#Ef(N,=chNRo8Y,2JNGbH%T?'0Ud[<?vQMπU"LBpJj_mnZq_o/.?u[['ZnJKR(#iFi;I?8FPF2sf]Ho#<<ml^44=20Q8Li>qPWE0πU"vMhQ9wqwnYG9ntQ4ZOpmu&a,qU$XN8]VcJJA3]MUbDc-ypZpbK_:S)fgNxjY9hxπU"wF:uoG<)rpmWi3eJF=)i.q$7wX\<Txcga7[ndnSrq29r<E(XL6:.z?in=)o=m'?πU"+X=(G0/+7KDOu-'9P%&)'I7&#(?/R&3%XOr+2Is%]fX^347'w844>gO2XPBZ6$_πU".fpr#J=#yl6CPc1f4klY0\MUpCDl0GUdnX/ivjKYDW=3^KD2HjqS4'$%K-qqXA4πU"/:mq-(YF4G0:fp4\qBEU6Kmi=)^1qhb,ev6cCG*:LfJ/]t#[9nZ:)Lr6[(/5,9yπU";*6+<[*J\8pZ]Mr:eLj:KKg]64K,jDa<WO>f*>Ast]atDFc_f^uokvP2hi$uI#DπU"knM*vV3CutLG9Ff^_8dp2M28s+HpCY8h(^gE:w%j1#Y:)K4F80IR_+kVK^\D2HBπU"-G9%FAj_kk/lvzK6BZ=tAp*::G37F<K/Ik30R+uHS5\hP5nC>E]Bd[<OI3Df0WSπU"3<1;\H][L9x(dE#GBK9m(%lG^5/bM0>vo?5.KS/TbgZhUQ&bkra>Ph-De_Lw]\HπU"A[)m_z9PWkRp3o$0MMpY^^?#fE\zHW9Lv&?=QhEjjlAk[8ne8sDL'P[stc-WtBmπU".WP%0,&06$eM[2pgs[(2q<,6\/;K4re0tA]AZ4w>cK2Yi83?hCWsNB/[n;=U,-UπU"w:Lrkex)[8Ft7ZJb;g1_JY,*n'6'MYhqg=A>Mu7Q.>o.vQ]GZVP;iI9<n5H+rV-πU"^iir$#P]:hJ8XX8pyK\LX8seRZYoA_7su_..v9$M)oMw;M::nA[y7wk[g<ykIo6πU"%+<XN)/[J<=B5Yl)x%A6uuR<*Ia#&*JH3vrdI[lj/vX/ZqU_Yvx(>_#Nz5iJwE2πU"]JIg_#Hxs\rn>WshA;kZ\Oa>;GR=<^^DRmUxZ2DJ</D\3l)k1#x#Rfid\eHd9lwπU"^'x(up%()9%%%%-%1yNVECeW)m&L&%%%$+%%%,%%%(q&VS[iln>5c:#(#V-jFg]πU"sRQ1(w[9&bwMGPVMc5.wj5G[cgg+j42TRQ*F*Spe._$ut\3Wn-c(pZdw85FL1biπU"oZ^J?6EGo,G?L+%/ow:l&[7Zt4[<cy?..+1hSKxR7PqV5906IC'/8JH_S<iNdsgπU"9/2WYxu6jN,Fd7^1=IDNs*%Ho]m.TQ07$k9.i1PW&7GnvJB7IEe#)_H7I/?]:hqπU"Y(lQ:*W0=>65#a+HkL7D.du'T(d&Ts*0jS'T.A/.eu>,2)_3Hs9cqB#<^ey(9xjπU"JcJh6lG[isI$B:PhQGDmmjiry5_H-E<_:730&Q=b/*FJgAAa,>v1oxAb/6OIj%qπU"zussr,_Mtqt-nC-.;PhnVY'l6k#&=eu8.I7<(+LUkKkFFuCl()fAgHGTmpTgI*/πU"4zGM?5)c3XecZ21#4'O9>gs1M#\fUZm37,^I%PuR^=T0]J3qh<4sCLj47XEr0JmπU"#TUMAO#8zH$o8CQ:$:$Mv'%up()%9%%%#-%KOSVEPx79qq%%%%P)%%%,%#%%q&%πU"WSiljn>a:%r*V1(i&;JC51$&,Y[m>[x)Zv1hip/4I?]\+00TFe/s>+cjeiBZ#tTπU"#7ad5CRTlx4jbvpSgtS>1uV9n:X,V\a\Z1N\9g5#<?oT&=e]Y3\IC063f1>[X*FπU"a2/.&;jk%+%zrhUf\5I=-Vd-::XH5H&6mHqFAE4r:I</W-e+Q>xHEL<XmWL6F(lπU"grv&$u.72OpXddJ7H7,pL9X8m1Prz48%]tmnmJ2D?gR*>*$(Wa%^s6v0jtXU&E%πU"THZ,A5eOFN\SMBl*qO#$6z0w_6PP%EEAu[[3sH]l2+rQWtf=60:b>^n'rbfsdb%πU"8up(%)9%%#%-%B_OVEBM[7Ob[%%%D%'%%,%%%%q&&XSiRln&$9J2;U#1iH%REI7πU"<(=Rvam)X^</1<ue6[G5&hc+t5=Op][Zf$v;rfD201ljj>;VATq0xX::_PDzY5'πU"3R^Iaij=a6Y><QEUlk^(;H?:u:eRAFHR$\f27Z.7([qXSR97h9.zJ>E/kJq_4NUπU"WIRLg/2__27a#bCqKNFN#^/BTS]gxp<hMXx$xHCG%<up(%)9%%%%-%B)ZVE=V#]πU"oF%&%%$%+%%,%%%%w&&VSiRln6c<V<<UL1S\J0a+#ELo2Cgb];Fs'IR$j_Palv'πU"Ig6)&HM&(cJ$8>SrAwKnNC#tZTPj#cUxRm4NJH.Ib\?y->7qeH\B?ttw.->/n++πU"9T&zMd0>*D64(FEy)Zj,x\q7)2#rfLub_*KJ\)TiN*ozqu#rEw$.m*?J['VrW%JπU"CpHXb3?M_H]n1b;&2[6d_dxaxue,(J=2w.ofG'd0l.k8L5mG:nq]'7;NLA<C%MxπU"(i.IHS7Se>EJ*P<eU>of+op-lmW?ZXjffe;\EtEBBoI4>o$&B4Q%u\'4j-c-CF^πU"As\op,^\,ExhjXQcS-hVZWKF^k,7BR:kpQ*cuMn3cKdJ3RF8J<+io5](54I;RrWπU"/$q=[X6WB>L_p38$ium&fnnIHKJjcKDH<=G730=i.NEBF\AnqbfT&$BEk]KO7jHπU"6^x#F=j1Mt;^Am8&8#_I=B&02\djlH?h)I(=^JPw_8GFpYE1dTM%&up(%)9%%#%πU"-%,_ZVEMomEpg%%%%P%)%%,%%%%w&&WSiRln>a':r*V.1i&;pJ_8/DBtM]GcZGwπU"J848U^O_=Th(6$q%7g'khJGb=ooiRpQ0P<JVIGRmQ0vfDTth.n-dq'&]#WlhA^NπU"58A_>.8*)xs[1xh[j)#%zQ:g9:Ah[D$B[KgY9WEY'y_Rh2&'I&0.Nl/eOST<lLmπU"CLh4DG*<(qYogFsFc6(A;i_Yrn3t=&#<q]X>kuaM02On]mac9rAw+:D.BG*^Vy;πU"<#:XgAM%^g91^krDG0(WFu](4Yi:);=N6I:(,\4u0$\hnvVl<_^+l00\i4?is3jπU"/=<7x9XW?XIVx9tdb(%up()%9%%%I-%qZSVEs<0=Pf%7%%D'%%%,%#%%w&%XSilπU"jn&$J+2<E5.hv&Mf6$>L7V_C2WJhk0)4fqv&xcg,VwWrG.E#Zpsc#4.lvo;(W_ZπU"+Z$m'yxatT)g'Kk9\jE)bbC6/)Z$Zq$F7gs;m.kgV=#.^c8qdcFMhaj_U52mlN?πU"nSB6/C<zLEL(nOSk\-xDsxLZ7_FdFVA$R(+SI$lqnUr*G&h=^N=kfzlXpyx9e<dπU"0%up()%9%%%R-%;GnVEuG&w:k%%%%8G%%%-%%%%gf%hpSimlnf90B.SUR%%9O&.πU"dCn2K*dbV<ZTY8/&r+nAUlwnNF%p'.aF(8T)-5GP;.rL^oyl_=;xQ-b?&z/lUi-πU"797Ig7+Kn&%up()%9%%%m-%'-n_EVr-Wix%7%%l'%%%/%%%%xq%nrjV%Siln,tKπU"f/'9E1iiJ^vaJpbvz^Co#*EYq5:pKY,mRjnM)sWUbZqqh9).UEM&mM,ZQ874/,>πU"6x$:'GQ7dr#\Ogjm$SH(7CK$G.2Zvb/\fV,nq'u%p()9%%%%-U%0'd(Ec7a(5c%πU"%(%j&%%%/%%%%gwn%hpZS#iln,b_B6<#U1(d#4PmrO=/$6#/m#71M,3K#EfNVXDπU"/5ug<_-HrT)pD_2,<AUIWIt(j3k5<q030U7-P62iTv)_sX])Xd))hVsQvFq0^.SπU"H?v=rOy'pFbc4(L[Zu/KhPj(V^rBYaBm8[dWaA*v5G[J8/.zuRN?kv$qxU,\'G3πU"ocdv^Lo:VLY^=yu*_3iq>u%p()9%%%%-L%]cj#EbR/'J)&%%%^9%%%1%%.%q(x.πU"nf.q%VSilsnfQJ+6;E1=+YXBGk=vkfD^l:.<TmC%w'F9/qkya9ms]Hn/wSlAIc&πU"V3v4F)R6&p:V>ZCTNtU._,\H<a]+fBUnw3KAq\Z0kqi66^8_k[%8%=>=hl6oibIπU"Jn<8(lkvh+(rD?AN6HfB/C'&<B5K_9f2LJdUD]b'GhZ)B]63,lPYoEw+0p,h1-)πU"*G>(7*gVl10=PnQ3FEgY;M$%*;A2>7e'>t>*^,:pt,L6uQO6\vNDslHW0&1k_]KπU"mvJ7SLDG+vNq^kJT$5msjrX$lewGD\3JqN,S&Uj6^n$74[=bx4rFT$c%[<u*G_:πU"<m6nfw;.rsGk$s]XX#]%\up(%)9%%#%-%:$.%FQcF?W*[A%%<'-%%/%%%%i%fwfπU"m%WSgfOxF,<GB[macwW6vaDcagj=tUjdG.;e$Vl3S'A[\=EtOC5;E2\g_<y2P^gπU"AEJXCxtz#<.yx^qxqLGF$4eV_mCIJczddJhJYmSN^a]nK[wq2P,Ua,'n;fR=d+rπU"Q\0>Y'pkanB\:Dv+f3so5F(RJJnSq(Qu%=\iu*EQrt2Q6Wf.7LMBHFJeJ\3\p#PπU"g*P#5]5EG0hnQ1rXfYn-kbMEMAi;nk^L>lu]aLd#ijN,\;6jHU$K4LdW$DV_s^tπU"V:D471LjtGkHow.#CS'SC#uH5J(^\WkwwxFPPdWeq8#Ko47xuuX>#gT.]d]Z=8:πU">j(jNATxq>hi1BJv13%?^9$nc-/c_#JSpjqdW(M^a$UDAGSGIH0r20)]GQnMGh_πU"V=12G[eaXo>rL8kQKj:AXLN:4mMnPF.[&9kF$0gCenk1[G+a4mnx8m\djkhb%MKπEND SUBπSUB V3πU"#S::aLB,Pz^4mc-Nmp+o)nAzgsCVeaP4#%E^Qf?iB(a9FVJfGt$Mea3ZRJD]N&aπU"au7f=W,(tKJz7>Q2%\[Tl7Ld3]F<:IwzeN]0Vtnxjojr(N4+F11C<r$<KtFe5R\πU";C\QtVN[ZYZ7K%[<IlvWR#MTit'95>?bf#l?s&TN//N6:,-Ddk/V0w=UkKQe'*BπU"$/Or=)7L(e/9)9+Bq/>XUC+ZmME7_\[M#x_Fu>Zs)K[aaf102JP':zG%O4poS56πU"%FLfxXE.O515E]7bBtj(xA;OS42nrnV8snNAcduc;^FQaiwHWEMK6t6g*7VhB6\πU"68k^tR:*SoW936YO+uB)+v]1N^W)aGsPC-H(fh#CG%)_<X'q#SRpX*WCCD\wOMcπU"OqbLN?01a)&9)Q9#,,.2Q+YZ1>6,nUVdhi<0wE)fZet9r446t0>WGOc0Ag%KWxLπU"aAj(?h6oLleA#Us+d1#pdZdfL+Bk]RA3jndokNappS1W/8PSPL6<P7+/Iz68RmbπU"-Rq6[XgpmQ-+I]qe]G%iUca-9=)b_x&,$.#=bSFkEiV4F[7Xn?^<6/pHa^s4wbBπU"6mN1MJNua).1IadR0tp0ZQ8(9u#J*HKJ,fGe9x$iwd5'x]^ahA]d_Z=rohbd3?eπU"bMeP>TtHR+Sh+t&%*v,v\5+yT/<+y?na\VwJ_BsZFY]LneQi_IFh$GbJq+vrqZ^πU"uBc#JU82P,&<8d.b3qJF0vkNq;Kc8nlkp7^qk+jU<t\LY?ouQ8,/*eWsK=T8fOkπU"h36b^sHJ#egT>dYzTc3lHdzWn?daw0:3Mdd5'NdG]gLr'<Hb\>r_+XdQO3a2/gBπU"8E\0=v)8Qsv6I1W>SFut<b1GVEMxX#i==aET;QK-W?#=1=]?ZVaELJKu2T0)KhuπU"\0S#K+z1;6)=qBHu*h+=5S8)RB[V6q,j=)+VK+*f4s#\CjA^ngMmj4BI2B95\3KπU"j/f9Gd>5Tp/M][uA<_ROc;tRa*US?%1/<1,739m6BH&-<.f,[p1,&K8&o-b%[9cπU"[:'9HY4nU1JMN$/orDiFe&%KY&+j<'I0d.uwcP,I>+5c6J/'s2S0'my<DJXC_T9πU"dCm.AY<epE++<o<imL&sM-.VCK7lCt?19ME3G0PAmha2g,o?VYRw^p-vD*b)iGkπU",.=y+;<aTMX%'9_CObI&x\6)M5Q.ZCOBog4gb-5t1f99I1+QILaK-tG/JyL3P2XπU"Ya*CuG0h)b6t*bpCFEbk/aGoskxk5Dwm^bL[X*TR]q[_=i6U.XUv$-U<UL,LUxVπU"-FX9Bqvuj<o6GLQXsJw:\I3xUdLULV.Nc^((t4oqo]eRM]e0uq&+-9scE7e^,cdπU"%u-q5/y+oFK%GTT<o=z;g&'&7X%He;[BrZc)#:ez122DP%.8J1-o0E^oXa8O6a>πU"m)#elp1<pPOg#Z9_&V89O6aC60-u^H?\sBT3A[EZA=YEZA=YEZA=YEZA=YEZA=YπU"EZA=YEHA=5Ed-M$)[h%jQ^FOGe#5e6E(-o-$.)uSB7'M;3I&90V:%Y)hGoT6E(-πU"o-$.)uSB7'M;3I&90V:%Y)h7%jQF8OGe5.e6E-&o-$)JUX0V:%Y)hU%Tp7u<>mjπU"\%YV1[BWV1[BWV1[BWV1[BWV1[BWV1[BWV1#BWVS%B'oI'e5e6JE-o;B+6y=d%MπU"k+Ih%4b:opk1get%J9.tRF-If-$.)uSB7'M;3I&90V:%Y)h7%jQF8OGe5.e6E-&πU"o-$)(uSB'<<h)h7%jQFkO;J-d6Q]j\%YV1[BWV1[BWV1[BWV1[BWV1[BWV1[BWVπU"1#BWVS%B'oI'e5e6/E-o-#$)uS[B'M;#3&90\V%/07hefiB/;Mm*+%%j8'PI^(.πU":*u,S.'M*;)&9G0&%Y*)%%j/'POG'%:e60O/o-A:*uSK.'Rm*)%%jJ'POAb0Co&πU"clxD_]%-DFr=']%m-DF=>']%-XDF='-]%-DlF=']'%MD2FMJK64js7%;4b,GeLYπU"O+3B($cm?eR]'%mD2Mo;A%)s^+u[[^PK#l(MjSk:br^&crG>YmJ%0CK6jEs7%4GπU"b,GLpYO+BA(vci%6u7cqiX*AA(6ciYX*A(I6ciX6*A(6gciX**A(vc.?uqrrGYmπU"JF%CK64js7%;4b,G/LYOG/KYOGeKYO+3B;$c4?ak[8hRKld(MjE4;br&Jcr5ZcmπU"J%CaK,jsJ7%4b0RGLY4Ua<W2*s^+.u;hRq1tH=V'3/WAdc82G$RG%0sq[jh5Z'bπU"#XV;h1R9t4aMJK,=j'm&Jcr5Z,+b(MbjE;2'K,u[JhRAt14o;W,*]oDjeR3/EAdπU"cOQ+B;$CPL%4GbRG&9s%CKo,j'mC&cr5;Z+b(:MjE;6.K6)Gc=onYX*A;.6PLK9πU"?G,j6%mh=bZE;*3K61Q:W*Mo.Duqrh5Z+bd(MjE=;2K,.u[hRDAt4o%-$)u#[^PπU"A/t4C$_jk:2'K,u[I^PAtL4o;A,%]oDseR]%EAdcOQ+B($1PL/]uT]%A/dcOWhAπU"%RtGZf<F#c)4.C/.e7pZgPJu(KdhpE[sPU\b<ru;04mJfnA0#hl.R3bx<*YRtfHπU"q>o6'6eL7w9uYf_+j:cKcQXjije4#r=b\Ler4>r62m&sU0?M[n./ktHDR_n0TSZπU"S2AYzXt&yV*(nt2V+1Mf=2Mb#4:M/Q<*Arg:r/-j:q?FO9MG'/+GAiNKYrMGNL,πU"g6.YHeIP&6\ftZsU:/&QJT#;>OO9M$Q]2\7x4-21Kg=#E\8OJF?qyKW/8PG3/0zπU"qPp.fET<)h2m9z.Tbs[n#L=pl)(6]UqBisH;M/'W&lmI04Uqp6fb%=)h&r:L:3/πU"3[zFo/yDNT/qEM:jy-NQz9j0LWTxQT/xi^%Lqi(s-(5aa?)L^H4dg;Wx-N1kP=\πU";:F]Z>2c%quZEKTJRRTX3SxtOH$YV%fFCK1&&qLxb[;sf=+66sM(?6v+vm/hN]2πU"daWf%BN;[X+AOxIu0Mq;<iI^a\Vu(ohGiDdmT9?c?LTY(rg2/I;=7c5MVXKCO=VπU"hL=-7Vx%wfTC.nIYhvXT=oFlkCwY$ljj9b4;*FKu?1aVV)7$hd*L0R_1t[;W[(dπU"kqOLUef\:$&FwKa)SKLF&8^+5GcTju&J:IaD7OGwB$vaCMpa)&f>G)G,c92A(;EπU"vRAoGD1a2l5_w[#F6&Fh$&yiv*+QOs*N8LaoqF3k#0q;^ZWlUy.^y%1BI/\DOGrπU"2,<z6V1&sQ.cs8d[X.Osa$HIIcP>neH#OF#\zx6J'hJ+PB.Do1U4e(3ldIYatW8πU"S3Yp;o2iV_wM;p2r?$dU/,i-=tj8O/TR>5(i:WJCT%KlMXLjifdR.G,X^mBWg6,πU"m#n_kY\tR]+mq^jy=fXT<Xn#X7t*fbwabQWDaxVn%i(i(y^\IW/A%rXst=XV^&-πU"br_.VuFi/?vN-^;]1Vg-V/nt#ok3TeOrd_9DYt\R9$dX0Tcts'-pZG.4l'Ep;,EπU"Cshb>Ij;+U0GS8LjO>j<6b_;pd;jKhYZdhC\YWBto%+q,B*Nk&Tg._sHyQb=h.QπU"ULS?G<.JHPE81N>8YxSpbmRj;4\PIJ/Jtm%^s1LH94Y?uKJ$5q;#0XbF<fGP_f*πU"6deiFEnf4DwaThU(OTpbI95<#'zMy2YZZWBkP=y#IjRgRPEQV2sHjyQ]lO/)/wKπU"aB&cM#0Jn#ne?ATaG:dH4T_AJdd'lHJ:n'q6pj[DJ^w0gqQ&4Lxm5&ch7,vI'I5πU"DM<&f.N,=O&Oi(0%pk$1)VL3VyF'uN-Ef]VteZ)w'VDs8nLqX^blQ#i;jPW9<OnπU"e4TI&<<8#HpRUDSlSlg*whXpv0XtK6YwHkc=-Waj<jh_0EO6$hX)(t->cm>:WqiπU"Xjh8\BexD2PkK-)m1<6xbFMOXj'n_i?Q,F<,cS4:r/*t6RGs>zBVt#p5q8B#?:pπU"JasIan%<XGXt4lj#7DJXq#rJJBwNYqFZ1xF<dcrf8>kq$.***NR]HuOBXqbre$2πU"?]^TWQV:,-0#3cs.eBeq##IAT/mR1K/dN#<O/kLjaMlfrH.]NUn4T%i0IEcn9$hπU"MuN_SPu_ONOj^&zFZ,(Fztzf%_TR+oiF1dZ(EP=(JUrUnilmSD._(:W%iP3z_NRπU"u,:[rc,.ki%J/P8P)b9Hf&KWdnF)bbHf&aKTZHU[iQ^?gmTlQp=MCbvXc34Lor$πU"ZvoJ<Z(B)-kb.rTh-b06^K:l0T6K<IOrO\O=vH7t?G76tuoet]ZeTt3cH7tGc76πU"tSn:W%Ph3<n-iP3'(HBSc8Z(B)-hbDL+n6d\Er7L?bcRH],M>n#IooXGehj6kf3πU"(^x_8v\vfiwJSeY>8)R\R0[nYV6;^txjAFnMoFqc>=0m=$tTRW1sh[\>9vQdDlQπU"iB6%0j\&m57Uv&Zj]^7Y>-8N4]B2M-?0;fOx6VH3N:sD4=7Osa;L'TLf%9LA)s]πU"Nv5bf[y0;:q[yKp(7Y#83'k3cMeqV#yTtgv#yt9:Z>.#,&sD1dvu]HNf/x1]pjVπU":9E)w_k?5YDSR%v*3,M:ULCdVN;M(Y#83'k8?5Yyl0dt[)S=YvEQlp#0;fO8d3'πU"kcGERyk-iXw(PkcM?:r#;fnOxf'5mS7[od[VL25bOfT<n9o?b%VppyB<fk?BsPlπU"wYl_ak9E0'SBqZ=\MM;m\=MU7-=]ko9E0S&LxZ\GKdB7][N=]ak9E06SV)Za\[,πU"wsE0SX=&MU-j=]%4Xl%_U&>X)rdc*RUR-=]%o4X&_2U>=)#rd*R]U-=]+keh.&tπU"6#vT;l9FM-Q%h,Q:o.g=KSS*FIZ\$U)gd+q:E\m'+2NS=6%L4mM);Zp_M-II&RMπU"II&Rm=I*.:i]UJ:'IixU3A\Of>=.TFq:=1D>+k7.a=]k9=E0SrAgZ\KIDT7q7N=πU"]ko9E0S*&nZ\GKpU7\qN=]ak9E00S2vZ:\KHW)7qN=9]k9El0S<'IZ\Kv1Y7qNaπU"=]k9sE0SFB.Z\KSN[atRxUA\eOf=.M*I:=Qq'??M-o/_d#&RU\9\7P*U?82'$*/πU"+]26UAW&EtA4B#rKl31>),]].=,[^.=5[_:\=rPUup8,U&D'BH/A_#&RWU909?PπU"UiQ(.k<Ma=]k9mE\\6bRF<CUy1d9(FY]<BeoAA$n]<ZY&7sdQ852N&2RJoJ>$7bπU"Iq;QzrKaw)CLyM&Tm0lEtwa8e;yyCO6\Hz\P6Uwy[p8+A.4Op=Wk/N*U)0u'WIFπU"pqN)hr3B\:\BFaqH-IXCtK0>'eQeRU;)0]N'JgaK0e;o'-(>ZGqh'5/wc&2wPLVπU"Q9s2N;eq-g+Ym<\qn?%*K?6b-+Ham9PPG;\XE5?V$w0'NM<eYIcR%Z8cbH<^4BKπU"]ji,s:1CQ?.+.43Q=??j<h(6_+hfGL;>[8eRMVq%l&Q?dy_z#W$0sFq]GlD_e-*πU"uAVKjNx%)2uaF8PR2Muo;[HQ[jQc3Ny#CRabjW3Hgyb\_o.>0jVUjI6ZuZCU34qπU"Ceg-mWB1?4*6)T,ttUnX>\M.?B7rbKhlZ1#u4Q?Is<^*hp9da38_xW91lR2C5K^πU"N^\iA,Zqf1tmigCP*+diTLce+$G=>cdq>.35>IBCD)-#rjZhYIfG,tlsWLS[o^aπU".x5#b./e,j,14*V]BsL'][$*i2UU0_f\F7U:,A)la8+l<)a,G-phylWlgvsZHS$πU"T6S-S#%Ccz:L^<eY8Kqq2p4s*15^^;x,(UN:ohlP:YaXk7S,Sam=>iBBNlrhSWdπU"zKcidmu4lfVL.P\Iz)LeNdep\,6)^Y5nii;aGB-.b5</9Q>_c$evO9Cc&x_eWtBπU"7847IQ%W3KN[nt4/I6dd.)65(FP?b8%rsssrQN=l7Mm$f<mmn8YeG.dML.6c,vKπU"3n[_PCEf]Ic?;zfpwBYP-dUqX-u>.\>(G6bO'/S.ZdkNG3ORpR.?^[izl=sqkNNπU"p);jKsW'vMZGlSRT2nw,8ij5%89d.,xNrBRiXBlH(QGdpb2Lm+L.rbkev12U-H;πU"m2RdkD5t)1x>bfraA.ItKSdYQ^T+j8wtHZ]#6Pnaw7xt_a>9)$j:_^PN:03La3iπU"UIIUewMm630N2\qjW$EBuJZFx<ckf0Of&i[X<t[f\vF\nQwf:??^^+ZCRwKg,KxπU";[.;7<Gf+HRa,BkW>.ryf/Dw/.(HLd[hcD$GZmbj7+.dpmlQ],SiF(LDtWR.WQ;πU">Rb4;c6dMlxM7VpveVJNhhZeTDDka+Hikd,VN.gy9;$n/vR6$KgR0r.2DQOKRK3πU"Ryts+2/RQaJCvo(a&RIP<lJ:]4h[wX:$C(6_DvY[XFXw^E,[j#eZSqW-ylG9B:&πU"lMmyXU7JF$tFLNko?(4aWS-j+A>(d,YWO^*wQ/3T4c2Djs0;+ZtAzetASn<Kc6&πU"Li;I3cxUGa6FF6n\45S8JO8])5Nvbl.o'OOKaU;2b4YlI^Gnl5'I^N:.hcukg(eπU">OF>.bJKh1hIoVukBS/,4]LFW5f3*LGk>6NY.VOjafvto?;w;G]oT]Io4vkE/&wπU":DJt<CGTMDWNnkA__Xtr,*-E:D,\up$T)I/e#X*FF78l.bo+H+n/qaV[Js+[*f-πU"M3;zi)owJUk\fcYiuEHkwCsl^*.:%JpOIBmT^Bx7dV6ytjlM#Mn(m7h$g.Q5<ivπU"agv^oD'cP*?2vQTf?\\1d*55,d8wdR\=11\Zbg\5qC7)2jdX9lpc3P>-cFPL+MuπU"w]EERuVquQaSnrlgeW;(^w\ZoSBW%Eb;qksPm8:Xt,p<3D/vbY7OH<gUEDb\gk3πU"lpnr(Of1g,[RgcEV+NTp/MT?.q6XM=jp5-*=lB;qaMa=]q8l_;chg*&)PNZ^1aaπU"s4a#%H\)fR8F3_O,.))FDLTK6b]KR4(^Vg]sQ'94shE0<hEQ0TJL$5$lnpt,2w>πU"p:?8>#K47uxuX>?#g.]rd]=8$:>(j>NAxqW>h1BGJv3%8?^$n?c5Ds;+#+Z/ygIπU"A$GGIHP02pM8eviEj4V?jI=RHc>Yl;TeTqHiSss3zb457#rjK:<BRF9E%#aSCtkπU"<e=oFt5uhsdn-IpjT3pl&Yc)Rv4R\LM<aMv+d_#l\$I6R*dB$Dt+uRP4>,XBvdrπU"njB6e]Qwo3jAU\v0%J<$Gee=yb*Fs=B.:t3GEe0Nf*/Ymqc&tsdFce9q7GNER\vπU"7o$CP.37o3tQIXw$_^y<;Y=X7CQ2w0k#PP0>I0:Og$nTa,;;W*h-LDo=Kdd,Z-'πU"efD9P-[kx=O,p]U\rvqGg+w(lkFC4Vh<N4,l(_SqsqN6e_l^bb+UdPr/;l2mx+vπU"f_fKoVPo+bnH0BB4b>=B<<s7QKI6wk0%SWjMr].RqW7Jb>$R>XVm+6:/FPgiyf#πU":n%Q=evk_hp,#uDYwhHvBkL[?'J_14s^dd.-s,mvCsePHC\K<a1[L#DGWVhT]ZwπU"iI6Q7nIhq$XH(R8:UvR_P=)5RbL1OmXY(:+lPa88rsN)Du4TTgB)\S]79FDV;MLπU"be-GGqaW#36Y_girF=Np-y81IXnoGp%MU,r=(>x=#LurZhes[wCR<$GnA<%5>7EπU"$t7&k]kd;[LUckGpNQf8?XhoT?;SL[Uo]^:7meG*l/:a6AnYJ,^Ok.30+qJRom<πU"oFK_WzWKOhN\%Ft)t)>HK7;JK6>f_e^G-NI9sC_uZSZo_#KG;n(<--+UYMqKw-HπU"Bb)ItnUdpf)k)GY<u,8wrM)FP'w*O1tz]/VXb#H6A,d?&%OQdQ8>OC>^UX2hpiaπU":V'dNKClby&.iQu\\R:<qHCkxu]JwI#Ny:jFN$t#D[nQ1]5Ez]6K>a\==xCH]oaπU"<xrMbO&8kbj,K:R.AYj=+VgK#RvBp_nzQtC+5j5$kFkG+'jX>t5]ICI(x/sk<aXπU"D*5KBk9a?0oN':0L?3a,>/j?],:tPjPDGWr;s_XJimRC&ly_[9r_9KOq9qSNV+RπU"q#TEr\0e/h\uioFAi84V\pnFK8GKtkU^(o3bEkzpKdK>l*0BBBbV21C=8>m]Yo+πU">RN[0RhxBpn3LTtk&-,KuE>/wT)TDavUGW2)%GG-bOg4ROX3Q?hgM*N%ak_NC^iπU"ZRJb8kR.j#S\1O/Q&%A(fmN_V>-bhs_oi<32ADHh[j<QNi_Gy3ul3cUTvy$yYvlπU"SDBN^$%tVd2xi)ziHrx&.5Tdxhu>302L=RD*an,i,qV(tv=T3H8vOG.r2^>?o,jπU"KHcP<X/LE41hRL977$D2%ZVT$k-V%KNVCm%[NTJXm:>d8Si?N'_Wg+OfD6SnY7-πU"#t2CQ;7W0..\)/3*pwQ34)Ly2I'03J+isx\Fa8]:)F;+f4j3w/eW<IUlfc&.[i,πU"wvq2-]Lb6YdJ;0n9.Yl+(vn<cIS$uNL'&q6nE0C&lAmupdmHiU7HF[K#tuMJu.aπU"0W%-[,%&(%3R)i9oKuA\5;a<<-M+6Sh>=U4E=Z4Tu2x-:Ls^NeW(,AxT8R=k%.nπU"*e?4:S/jE\g_8x%Apdjiz:e)/p5>V,+-BbeOO11;iB+&aMe=6KKac5_^:-<lY6%πU"t*$M=6HNqRa:Vo[qAr>+xJ1sdjU#U8u%2RL:W0+S3Wr+agSOk?;AA/Vk];w/'00πU"H0($6/DqQP[q]JSGrr7V-\)JfgA8PLsQ.L9fO.2v-TGmdvDDY-A/Bo)hf&XaKEbπU"e7qdGrx6;tSbm1x9>NRFoKc*S*oejpp,bSwB2ypx7#nr%?VjF_=2HNV<d>W1v$dπU"SFs0FH)p,jI*hsUJwP68N#D]D)yB$c3:j[?5Fc;KoQR+)bUJW53]jJH>iRx?+lBπU"VMJT(h>h/uvNkK(A\pW,',l[05f9+Jly,_G>2/Z^rRQET3[tci;Fn%v?:545K/PπU"a]qcZ%2Q9s0WUC*/(bgT)J]hXv\&(E\(z\DuM_U4AxFxCuvo_-xt4UGf-6Cb<C^πU"(2aB,9>r#ikZGY0PRFmWu+JB3%Q.2dtaHQD(&kDzOb0Gh.VA-aG'x(up%()9%%%πU"%-%2uIVEniP]G%]&%%%$+%%%,%%%%qiVS[ilnFkc:<<//-TR+3REf#+T5nm$qPAπU"?ffIpF,eOdF/us;.EwzohdY2BMKH_6WwWH^308I^96t(8ux,1Y*KqFy7+yF'eRnπU"tD#%$x)GeUodS7n6cOyN3GL-R_f2m#]uP^I022I^_J/q)QX?nP68.zh$*\Bg/a#πU"ES9wZIa9#*,tgI#7'6rfe?J[\jjuL>X>f6NeTRkKe/sP+GX=pCGvEBaFEYH>XQ(πU"6SdOl+nWu'cJS##VH&c<SMH=mxYHO_hfSY;kAD?jr:tysy;n$g^X$-Gwm3zd4rLπU"pHnc3O^(odDH2qHug2Rrzc([m^Bpt+$u,_xMl%kBt>E:ex+JV_X(U1i1NA*B'M,πU"N+<gls%EoZS,6bPF%p2h[PC)4\15<YUm?ElM[C>C9DJjB-CL<u%p()9%%%%-L%bπU"[)(Ec2A*OU%%(%j&%%%/%%%%gwn%hpVS#iln4au:2=%U-pdsqIfsK5./e+3IZa)πU"+t0=;7sqhW)[:Hc(X=pNj[Bg[>KyFI9&TYAW88KZc]Mn'=9^2mO]W3f.0>s=*:cπU"x'glG+&QlB5?TaDBdkX:H=B&;OLt>clAfq%5D#-;,S5;Wf<8RcO>4V&w=V=po4,πU"En1SL$Qfu5'Ti%,up(%)9%%#%-%y)JVEjmd9)d%%%%P%)%%,%%%%q%iWSiRln>aπU"(V=)V#-jl%e]529;<i6v3C+0$*g_8rW,TH$&zi/EI#x;sgr$ScX&xHKZDwuGLd]πU"fvZ0\n7W8+iVgzN'kifK>3Ne]JfN$(+Y''KXpn0nE0iT30jIk>OT'%H+g7E7Kb8πU"_jP+8t%;.i/hKSo?=Y5V9RaIG6JW\(Vxb]lHnrDLp9--G9&Q\lCt1D^C-9WuW:ZπU".U^ur3&\;Q?cA6<HOxUJhkH;Zb&.$4Z-BRGdAB_$uXX[Ako7^s6ou]cC.^k,Qu<πU"gPnt]NnlB[r8>Ie4)ROJWm-meYkA_2Lm-GzvxL%&up(%)9%%[%-%q_JVE[Q3YRXπU"[%%%D%'%%,%%%%q%iXSimln&J9:2;UR1*IWO:)2J4#?/2P=WPXYIBZZ(V'*..\3πU"QCavkT(Foe]<5.HJNP^Lt+/ZquSd/tUwLq:x(a$hV0f/dh3C^Ez+I&80w)yJ1vYπU"x?5<M+zEP/0yt=-SQtzpdL#nl%8Ld3^G=1fgodJk^XM='vhu<$vL7+\S+YtVL&vπU"6)(k\u%p()9%%%%-O%;OVmE'5%&kS&%%%$+%%%,%%%%wiV%SilnE6cv=B<U-UIHπU"CKR9>/q'PHX0EP\6#W4cee$$>s&/(8;_ZDzuf*&XTd]uvLknhH*eP?m*5R3rnQJπU"<(7OXfQcG'[BV]OFr[>:AeW15IS%Rs%9'_K_gOs+/y%S5H6MUP&Pk3fjHEO6a[;πU"WH:85b,.a%X%Y$957%-e)w-aDE'CG57W0s;U:_7b5:M(P+IPfIm+(:3ev''i:n'πU"+wtw(hjm$FV3fu8$%2SFpQS$P#+a#tA[IndA&gHIw$R5Qgk='=3wuqtu,MruXHRπU"ghLZhI&24Tc>ZaZYAhDclnL4Gh$jmNWolxwu5dl*EZjp,An?hw2nbko<#qiZ:.9πU"_qP:tUlenc^N2R?(B,<N&d^Dz:IiQC((5%tywtVCbdTQMd2R'l\up%()9%%%%-%πU"1>PVE[=xsY'\%%%%P)%%%,%%%%wiWS[iln>eaV=<%U1j2JplW7qa-4]IkBJTb;xπU"52\_<43#qtvo+I&m?\1I-IHo<+mnWtcDZOpPD>iWXchv^8w,4JDO'8QAySPsDANπU"S4cC%LIn?s1NCT/uwHx^:6z.JqnX[?:G=gFG:C-7M:oOQ&o90-/[?1Z9i+)OfZ=πU"6RF:';pCM=O=$H&\E.hqZ24>M1W64a<IQ(Vn4$ph?\v_l(piUl7ThvGelFHW7R<πU"9<-&I\#3],Zs2uiF8]k+SFAr7wwqfL(6eHldBW6r0z&Ql-ZVnP.KD?wm>8p_CFxπU"&sDup%()9%%%%-%2CPVE/6Y,z&[%%%'D'%%%,%%%%wiXS[iln&,$*2h%F1ivn%-πU"Yl#[>H:Gsl5(Ba\9vK8puWm9(w>:TrHZ6H+]8=,XH$>tvom'HI<z1<x+y]wtRI?πU"g'Oy.$yp$&8'M&\Egu5aK#2F3-e<PFj:fPJkNB>u=mbUOHGH=XUuG&ipjSxTAj)πU"mkH]*_Em6DIhmf0IR,>EsLk.-L9XzxQ,Zn(u%p()9%%%%-L%;HVsETJ\)7X'%+%πU",:%%%,%%%%ifV%SilnWffJ$AkU1U:\I13+3?[23e%c[ck_C'2dccg3kahm$83>hπU"1'U2K\BXfU?*/jLY2t$.ZoH(^uTf$tWh>X>T\:x4L1&+#=aW8s]]XeGo2Y_es:-πU"(^<NmSbhf]);tv$EWC*_3kZH?=NOYN_9>9<d^fP+0r:qXtl0[mSXD&R910rpwlgπU"S4<0p+xB8HYANC4o9rA:6H2\9Kl&$[S2w:NaM^sbGnHm&]/#6^Y&I<I*HlefY'#πU"YGc17r0[?A$7Jw:bOK)A8=1S<8jQZx>243+.D[VE(QI3[B7qyD=&(k2f86CmCRIπU"f)/3URi=$D,Xud(FcV9_m(V#x1rr+3>H?Rap9B#=#fdbtOB$+:]n0n>H8Z]))gDπU"%jW*:1ZpO)h[2p;+1o)g:(^Ie3:z/1B$c2;..k*8AA*N-A6vkNeUZPVeh3=T4lQπU"Fos,irg:P-MkQ+,8KYT^I:IRCn?9=/'GP)N-cn\8B&lY1%^55S:YtVr&V35+*y2πU",$-DDNATJ<9rsq,NbE^l%2z(lY-2blAn%eaqf'['dTB)a$p_.g0DywlUde:<b)0πU"^qQjl.;G>b[Z6'8CiTGFb=[&+dfprzu2s7ZzKg:<:_d?$.kZ>d8uXhw5YjL2GIoπU"%.-ur#\goH$2NT3zc$<OnplGLWrzQo.>=jxid2sdcCtBPQRgpzN\[PeP,%bHAOvπU"9>Qf=rV.EE4Knj>1Oo,sUpB2em\Pl3[Bs#$;rn)01_6d0_5D=H/X4M$??toL&?^πU"=l;HV_h/_<Hce:NkwRbVi$f^L,ok^sx^J+S9Z=:,v9Bmg8i)HgJCXYLi[66kZ.NπU"8+[&t+jH\%Tup(%)9%%[%-%\_HVEsPcUlS#&%%B%2%%,%%%%i%fWSi7lnfz<D<<πU"U[1r,aB&zj=&_2_o>Va>\QgIXANZPBC8d'^l5a&cRAQ%fBci,HJi]Rmrsnknr8#πU"]5d97c5BM-E+TQ+\eGEW#:mow>uLQ]7CRn&TtVl;7j$%WEH7ESyD%2zPHZJg.W_πU"%O586mUzTmjk'5a>T=%#kOJ/.TEUDFC/.zw$JO9<O_tCp^.t%a:2tI1#ATrw8swπU"vY1HU>ikz8xk3\gbgazfyD.R7qs4(mrsC29gXNYk*Pj/G)m(Wmck^./9<N^+?86πU"PBmLP)9-JD_[+MP)<)ZF_J;JfW9s$Nfq*))XiiYD9v.lJXS-7A:Ukn&*vwv$aVeπU"IM)u6qJBRQeVX]agAPqYhA_qYhS_nmGq+q5TR.VEh7Ch-r1m[?1Uw)WH=g5nnVuπU"(dbsq,OxPlb7LpKi-w00fYI-tpF:\TC**mYIHMTuE/%DxQwzSsbNoony0Dto8K[πU"Q8NLdJ0Yn[o#-AcQdG5XG+nT#A.M$=DXfBF)O>up%()9%%%%-%1bIVEMncVD'(%πU"%%'l,%%%,%%%%ifXS[iln^ba:2;#U1jBN\YS2c(??Eo:g]c.^=P:4OZ>P#2&O#*πU"apNd1wl)dItd=vftZt#<ZeGn7+:hpnHuJO_D)hsb,wH?B,;y4Y4JUY7^ZtLB/?xπU"ZQbZDu(6X5ZT/8&X9/ui^+-agw[f&U\Z*Q;ud*Y.jGE:./LRgQ(3To*uXtM2*-9πU"Wb,)K2HFZ'S2#lxA,Vp<68]$w3T]$/XS]ZG8_u'FM4O<Wf]T'm)up%()9%%%%-%πEND SUBπSUB V4πU")_8iECgOdF&b%%%&j&%%%/%%%%gwnh%pWSiIlnD^'F2gVC1Rp5Leyi]*?$JW%-(πU"UpTog;E-Spe'uphd>V].0Jq:^D,_,jr,>k1)nZ5<<AGG1l_oi,4n9Zy=I)T^VepπU"pZ+p'Mncy&un$meQN+*#99PW8$5f>=Ss/<3^8.%l%b6NJ'bKjT?KoW\rlZsWVRWπU"6juZiV0_,\?'Wjo'uBuaZixI7wjStrA%#up(%)9%%%%-%A\uiEcVk00.%(%%8%GπU"%%1%%%%q%ngwf(w(WS[ilnffS$]T[U5+Y&Th-72oQT7G6TyU)Kp%N;BQ*xTqI3ZπU")*D_y&O1No4A7x,T4q*Pd<#Nr/6iiwuoh(XRDDf^Nh.MM\K;TqCQ,uLJeROyCUPπU"e0#g/jX&(MnM8pE*-*^WzMCjO;y0hjY%AT-hw\oizxnXb=R\RSs9c\Z7PdX0T;8πU"S5C7awi5g$^?qi(6dz%3XEd7dWwo2^,Pji:5>,er?QpO&IaG)0$SPfdsI'P_xn?πU"WKAN1BS]=J1YYPdT+dNUkYW(rd+q:^h_QBc-'fSg[(Z$g5G,PZ<<TDT.Im7gq2lπU"XPV1gCHJsTmm1\fk>,KQE3s'Qte;rZ(V7&>lPjUy%rW<91AJ*%)-c/Ac#v&DBWWπU"+.v<=0L#WEd%K-le#9SX0AJU&nF3*9$Te7.4E?Iw>SPAJViu:=&+S<X6>rSqbPTπU"ziAY_e?e;9-Z1mW4f/5vB^9h?xa)Pgx-K[jW#B]8e,)^t-A%+sg7KL^\aB\SmGCπU"xk\=Zt&O(KAfZQbr,-fgvKy>9Kkb]%6mVGGPd3VL&Vfm0hADSJ0Ar-=j?&-92f6πU"T.<W=A^&M6\1]P'[1Mi19hZIiY_S<u5N,+FG#)>1q([W(DE%G_/,9V2(D8cjW9<πU"eXXf?Cxk:89pU:wg./%tv$-Ph;9c>BcdZC647\/Y8[7af?Je*JT-P:i[*.ev90VπU"57nm5\0JT>I+GTSBoMlW^6#jU,NF$-.088FGU5##)ZV\>3ksu.6\'LFZw=D4dz/πU"HxcKB9]Hih8E.7AF2h$QX^TZLs+];Z9*Ju5%WJ/,XGd/BQb_$z<vY+kR[bMEgW8πU"-7FqHY1jkQ^bPM(u5.K0:-#*7-579(i?-t=1jsoDny>Q)FDl*H?MdB:Ve7P_2M8πU"3:rHGvb]Y5]_Tik8=cpk5G=JleqF(02DCrGU<TwqhRvh1HQ?&X-=8O1X/S]0=O%πU"tWjjfQ\Ksi8/Sn;ye8^wKFeJ#8R-VeCU89;/Z7fo]38'k-Pi.+f[QK;;=3eDL[UπU"b(eGs)dOY6[87+VoBH=V7taP/m7td\81HjId:UmGRlw/?$,I8eay(dFmEgU0%7VπU"H$piqg-^WMV9L<1Z$6wnUb%gM+?'x%up%()9%%%%-%)7uiE0Q>I0&H(%%%8G%%%πU"0%%%%qngw.fw(S[ilnfQSH=k[U5,Y)W)9I73cIKZ2o-1D.ww^2LQPCSG7W4Q(UGπU"w#oB#Rr#Nj+-qO^IWS7<f&n,#huoh(XV>>F^\^TdXFc,<K'_SMdBl;eh&heEXpFπU"T%=FO]IcV_$QSbK=S][Ge0^(leGe+K;5oTAv^NK[1#Dbr,8ITpSjMM4p_h.5g-gπU"7/C;bCB-8K^i8:9KpxtSJS97m(f/8aH=<Q_Z*Yj;inLSY]UJUAJT):*Zn'bPekGπU"mG%6H?q^V]H72z5[5?XKdU+*$1.?GrMYAv-^w[,N)J</<VY,<ta&JV)u7M%11[gπU"5<)Bs8v1V]Te>6&Ggmm2#mOIT;X4L:d]O6:v)^HC'bFd$)9Hq?Er;j7zzAm+ImTπU"U&u<5fm%Q5[]lQ-8&$oq8K'A1Q%\2JOXfENq4-($oNMD\rIv9ThE[IguH9^OGFkπU"6e?[AMa<S$5LQrmq[+fX:M8)O'x-81I=aKl*oy*_+)[#($FXN^iPaHfGmGUx+P=πU"0tuJT_3rj:bz6-&gvKx=TMkbD1G_1k+'$B[L(-mIr7LM.5S*\?6,-*62API9^*8πU"\/O%8WE/+e;0#9rVZFn6Q?B:WM]FQ$B=IfKRw41[T0FPg3g;iFLia+CG=;5od=PπU"2tpY;#zWM1dp%4gHT(4(UW7l.?0<=.mITZsuG'(iLSw*s=v?:+e>.keX&P[$d%vπU";h=,W)CgWAr(t_m>.Tj'\))lBG55m8Np7W:X\>,.&:v]YF57n0j<UN&P[-08#dgπU"1HMB[;4>+W]srj8?,tOkuXf$Dy9k3wtdN?A_XL\kI]'%?G*8HL<tC2xS:M\1tF%πU"45:-I0[NC-Vu*'-VC:B6+XsV0a^5IcPd9EZ=]TL(<voE7^qQ6[[BEeq7w5:FmaVπU"=dbFsyF=55,$dOUuwuEFQ?8,>dfoaW^R.l^Qh/_<y#uVwUD+h1jDk(W4V-OK(:OπU"VUPY#d9ZSVjvVifaY0..$fW8JU&?]01>Sbpuiao&p[,OHo(9.s-4V=DovJ<KpV0πU"T8?.4B>A5K-%Pi'f8[I;;2=3ED:=x6](jC$&'#iq]+UaoCOFgM1'QPm1?O^[n&1πU"E:UO+$acsQU%*C.]yv*(55F-gH7V7H^=fEV8JKaU9<[s>\q\126Su71Yw&%up()πU"%9%%%d-%>'S(F1?+Whr(%%%\.%%%0%%%%wj%xytw%jSgfax.zJ,=ck58Ll[D%ksπU"GfodEO_&uFzP+6,nu2X\;lr0LU[t\*'*b$6&kipFEfIJ3u&.yz.ac#E^,u,,#DSπU"c_lXdtFG2hV/dhLCacf6IdF$ZFE-/E48w=swoWC<JqA0(dN8no?z+TY#5$6<HTYπU".[^xMlB0QGf&5*Q2&;2k?>KJYk_R.Y1<N/%&R>CIp%[^9Ll+3GDF]2a=56C#<\&πU"Ztk(\klR<OY,9Un:/.V>y1a7vbMT'j*o*,Qa:D;K^(QFk=/K_s*NG$q-E;9E_7_πU"q-/2[8tEAw*9a2J$be<X$1;SG3LW67aDdW/l_QD:8eW)YbX,ZHF)[r-7KGBX8S$πU"G[O/)1lL<AbzVSvf,3'(kQc^q9)+Y)Z=58itJQ>Cs)N9yQ,\Tv:SJQi?tP_Jyr,πU",#vBNTyc>VHYR7LneA)gW)D-0d]92Y8#KCK<[+m^j[(4,a'1AAnw<WHNfEbus7$πU"<Jr<I?KHG8J:<XV3_KK+kYtZu=G6g^b8_'*rR=2h/0_S-g#U18-;$]&(;%-Y70cπU":M+n2u+&7&41uE>l)?pf3RcinQgxkVJi^6H0(x]nDrO=Qn(QKO9m0T)Kv+AJZZ6πU";j:g*T-_2Uj.g/ZHHU5QQ>=pfl6T0xOiK'sDkdAERQ61/EGqIZAdL,R5Pj0om9]πU"WUZl:cEJ54D6'i#=64PQY=[5cFFVHiE+ZvTY>e%?vQ9O./zZ,ZLL?VfqT'AmWvrπU"]iJf4Y7V$8x]O%(MdmiKC4qrf8.tL9LU:CmB+[L4EmK/M^b694y-hp\p\Y:X?o(πU"J4\o'FgxLxF[Y>Dk+7/.;BrMei)SN_:/m.-e-B/awA6'GV)QfGTg]+.x#3kx=+BπU"o5s$gJ[bTx/?k0#aZE2NTHG2%/L;HU-*34a7PNsP7Z)p]*DR^vFOxFmn5^b6vh8πU",lS#CPn3P/\llAk:gLFKgQ(e^Ug>(AXD9PvrRk;EWvRwtp13U:h&;wN$NvpJJh,πU"\t,#^,QU7Ojb63h3oV-Hh'<HUI(XLijW]Y?m^UKhU2eAQb0[h-g31%A*J:44XrKπU"QD<HfMdn\BKdhX,C%:DQ6u?k:LVV=*BFup%()9%%%%-%6d._Ea\b\0%('%%'40%πU"%%1%%%%xpjq%jyts%SilnDter=B\U1TC^z+g/T.s#SU%pEl'JRmRebGk_8=V9M_πU"c+*#GJ,w\O=nuQ^^XNZk88.L%NMNlwsO)qShZ.CJsPR)8(WYeR<)WmwY;D^g>h/πU"nT:NNqrW^NE)Uk(#QQ[;8U3Q94bembr]w;N3j8:H(yTpSO3RWiA-ZFi-]<geUj=πU"3kQoVdl,<T;u4HXD:iswVflrUI-)_d;U44YJX01h\N>s7oaqqW,d5IoIxAOAHJ&πU"z1EXhY-%.N5l/65>7kjGreGWQ5':3o.<1)_uYE'YZcs;Yq)mG#YQ9,S;P,6djq$πU"BW'C:%<85\wp<[.h3.px8.3C;plOoifoWim9-N<Z0oNJ89\9=5$sC-/o0qo</nRπU"XoAc*_gFa'UlehxEEVh[DG(4n,J\?8;N)K-p])lPEqN03+\x^;]Ck1FtHPj.D'dπU"s]pdF;%'<wiOtxG1c^>:oGL5I=CL;3+b-hzn7T)r?:jFOVK#;gX*oK4i;xP[k_oπU"rd'SR\d5kDmciGc*RR^AxCI-p1?F%Tm^OVF0puWg0*?%SKyLnadPq=[G=L(5Nf-πU"0:M5(nJ2'>k.fUs<Z?15I;lnYpn0u%MZt=_(+,em12eecrhL3bRkmpm;s%R%hLtπU"+_Yc.VK9()vs2m&bPpA9)H85=0aRs?u+/tDu%p()9%%%%-U%D.%=F'N[(dX9%.%πU"\:%%%,%%%%jsW%SgfxK^b:FuS3+XW,%wRaoLx+Xp+*\;H30b_ZQFUc<d'RFrH\>πU"LuQ&XQF;u^?ld(kDa<b;mEIfR/FZ:*1085IEF[kr]*IKG:%l.dL2jR-ldm3ok8eπU"o*H4;vSt6XPq3m3Q<\w^j6?ZEb_kbLbgg+2.CZr)S1aN<>/%65_bS8$&MkB[obiπU"FVgcB^9lw6a0Qz*)Hzg3dmN<a%/ubeH[1pk'=]469:eEohMhr5)jVzm5Q-UT/<'πU"&?gpWAf$:D5I2P:\:+RJ5+r(.ep#T:O/.=6JSeU\S%:LOI1VTSBLLy#qs;<M\%iπU"HSWNC#e0LIH5as'cJOl#?hS&k[KrPL>#PT??\Tg+D\VI:&I?o8b%BkBYM4^CbLvπU"a=9lp1Jx9ka7f3rq?=BPM5fsis8kJxB,tcLKuR)L2($afipd):qKX<A#EuY0Ya=πU"M*PL:jNV07ULi))/xIXnzG67tOn8zLgAsCgC49pD)D,$m_-H6A0KkauYVRZr1jDπU"V/(lM+IGtrpAYW2JB/Dgrg#;/Y8d]M0:wS-+:OUQR<1^:/Ja-'6-x1\^arwu-q,πU";8n_O/,N:PwE3g#B'Y;aruw-q,SqVbrr4)&VpZUjK8DDiPHIPs>R]hFZMNbC>d5πU"h]VJdWesW[DT\$U1>FskA-f#7WE42lnmq8*8#>jG<a98J4gb.Swok*2+cT=F##4πU"iX(]>eA+=q,(A]behYVfWJop>4,FI(IUHsxk7cCJO$m6B%g7js?ouu/PLa^in<yπU"qDVlN7+3UJT7N9[6bX9_m3&KXhj)r%gZ7wBFTYpjMhhlmC5Et4ijMCDIQ(=:mZUπU"KKrGHVd$wj\uflTb16L/^/TPcmJ>/>p%\6[M(wf^2EDA/fWK>^,-=qlB0Ml78OUπU";TI#Wu],GDXo$uu8F)'\k7:L<[os2R$()[wiPwPpT1+i,$+hMBVs#->L5dpOJ#5πU"x)8<4jH_/WJQqFd\:]L'.Qw/W5/'/tw*QKf+jVoL8C)kuhbG<E0%V0WvO;e4tNMπU",9GA)aQ0=*fj)c&fI4QH+MQkTFuZ4uC/6GKM,TFr3AlN3q.o%8L'f.:1>GBQgY1πU"Q<XMQY89]kT50+lj*QW=18o[]^1V#yfT>#+.r(ElzGJ(UNmeNDN^[2[r.W:#TYhπU"lB7Suh>Br'O<?1V^5PcLi.;E2.$Vv#c,B7)Q8)U(lRH^RNAra]A.EX[X)O%618xπU"c#^1iR;oiG=nGk7oP*FxBb%e2#+\,X[/G]P9Mu?&WCz1[Q9uE=r^OvQY\\-aTMKπU"n;L7KMkz>_Wb.(PrwI.td<dVpf-%8oj.Le[P5QB_:l/ny*np38VmPXZQnres6xCπU"(gl^(YaI\t,1v7B$Sm*f-Hb.T]JkjKdRvT-mVg$,%du&j%#4Tup9oFOLlN<rLyTπU"AVrDld&ci[7^R2<>wN6b;)(3nJFSpQWZ:O?1NV/'aJ6)Vo^orEbYO32BgZ*(==rπU"cR%Qgavdve-Ak<k3uJjTsA4z9;63Q8x+d'$f+;etR'pMO<AQ,5Y)/a0?&CQEZoaπU";LwO'PGx4*y=gB)?4i/5V=[ZHUdep=(NOc9WG%qSI?:fH34BA;BsgY#pa_+BM3#πU"5be1Vbi$#qv+rd*s9SW<6&4TiZZCK'gL+036I%+U--e6(I&Tb+;%SqUGp11>>?=πU"_a58Qu2dHj%oAg9Vd%8*Jz7_Qpvo5YoGI]97oeM-h6T0[-E9Z*q+b_-B/WSK9HeπU"-)piZ_mT_,O(%6uPY&V^WGbET0V38%(:9T'/rqB5D&l89a^ZH(5+#5yaF++HzrRπU"v^nP4.5qo-Nh2B%yYQ#Pk9ZqOz'f_Ov'kf4u2Sc;CEq3BED]K(KQOrgr$xL#68>πU"[V.p0s;IP?U\WAdQfWTx+q\0a<K$*Pa-M(U,2<W6JDf*#6=:HB9;_3NzY_dfR'dπU"Pezp:wh&357xefNywoh&FrO_6:eqmFudL7MrP#+T;/9Nd#*i5[&3WIC,.x1%cX_πU"%V4YVn\[Q8_^e7U,ot/E_Z_hKiaF3+BJ07*[5uksI\yc7tk$1kDK0sZr(x9Y0l2πU"r;h*#alPm(d([L>IDep0XJU)\V<;Wh8dUg52+]7gh$>E?k*'4*;t$+*\L6W)Z/jπU"Tb.Z+4I=&c534u\)'\%.7W[A\GB_PV<h40g9QJHhCEvVDl>\m/Nt/NoL-onNqAnπU"j=Gq$lSJQUgabJW)Xj<Ze>PPsiW\o&];Pn(J,bC,yB5YrVIez-3%oX%jRn;)(I]πU")R$)KnSOFnd+-a=[j[%Z6MsJ4Dg%Lb:g=ovit0A5X8&Mrk08knj8r5oZds#EW#TπU"Y%6G9WO:*,TZ/\DVP6h8-Pd(#fo_<RS#KYHUk8Yr;7XL:=$:X$[oJk'1Z>Q7219πU"a=1pdfO0q9Abix-((^D<)1+pkiHE91)Vd#&-dmfk9Gf,&hw(<o5/02mq'$T(yKLπU"FGO>M#oF#MwN#oMV#o^5#)fFP]YWJ3&H%MgB[y,$xZXgHG\S8U3V%.SmhW+b4IHπU"furZW)ij3F10fgSaKPDUy-HJ*Od_5ex=2.HZqPJj;GBpQ,V\6b%H,X<-qv#%UVoπU"L'qfVJzeoV:P+^OUJs]JZl[SY\0Acw_S',KMDr[u.>o1HKd9Fr0n+)?>X'#U8AIπU"k0=uSFaXEhHUJb]=g-mGQmNZeK4h][1*OC<e;/Ni:[_h0qiG*Hpt?'#%I,cT^]=πU"A:(J(ot#c+c^f)oprJrBO3AEaa7Kr.qdaQ?9?-\:0F,=-\[o4/7kJ'9YaXmN^^YπU"]FWS)Gpi<j4b7[ULa_U<AtZidCp3'J.An3KH05\<=4)v(cG2QN?H:hK?5enFuJ4πU".-Vw-6X-:GzN\1uaA:Mi/d*9(GESj,L9FMHMTbG(h>bHWXl:Uj8GuDXHU25k)=)πU"4QIUyv,&Bb1'>9+K[a<KQ^TAz)UiP8o$UdRv5wX[j9Fh^ZO#.K9:k7L23JkSoH#πU"h3#oVe:B5k)]%efCo&dO=t'8e[4uj1cPSD8n%87>MRW\YeC)X<pfpACJd=Uu+p[πU"'x7AbHW(y72qF74'Y(k(>P$GCk#Fo4(%K.^HdRby1>^5^<FcJUVT40Ku?5?MommπU"rdP$ixqh7/5P0vZ7)*2fm*>M1%du(%oqg[QMbJ8Wfl/hP<R(?CeN4aF2G(YNs*fπU";5?w5geHZs<u_7YM2VY3x+4o;wb,SuMa5[j4K6FuClHjus#<7q;noY:=q$-o]QWπU"QM8M$-Tk]]F&6q.a$*OfIFBBac:Rnd\f]4S,bu%$takV9:Ww6DV:3<Wm=yoh:+aπU";d?]H2Kb.mj$QS7ELz_ASqbOz0sZgDWd-GUU66\UtGh+=UUg(d]8jNifh\=-5,2πU"C89F0mNiQqttj*h.fFTiBEjH5_WDicIkhUYBhnIcl'PkggOi<m6]Ts0A?>=#[wuπU"2%[[q>:5jT)d$Rc5t76)R^\eSZ3f*<APH\=O.sc1D\/.iY\LY$Vf^o<jN]mk42kπU"7_)coEtChV.Iyu$LM;o&xDW=C]qkdpF'TIEbajl-=qn-]'S3%jl:.P1CFtqWO<rπU"b[Se)3ph*aA7.<-egKI_bXzGYPP;98\Tnaq#*TQq&3'\9kjFH)\10i-yDhT-<[GπU"_0*hJ$tgnL27JFl=6Y1,)<N&^EvxHc$)RD%k;x]%rNEwr(*iRV];U3In18%PIUUπU"Ejadm*ar$=uV0Lf_wR5&#x^Agwuf&*$+nfZo#G#OlgrO_>T1lBe2GdxLkH6oG?,πU":u-fhrNogc;';Q]F/VmmZyq[S'3,SQ;X3Z#,\v#jSdx)J^XR8'K#(SLCT-a&J9bπU"P2bmDY]6oK6uCJmepqIo\lb^)vZuV5ua]JA(BJdk8ST=89[?Wgwq>s^COf*Jtl<πU"B-v<Tfabf5Zt<.DsYNDBED]^ahW-dRfZ7:HT/9KSW##:WvY:+>UQp3YqVf$:<>UπU".WJ?v9?95OqR&]/&Zfg/V-b:z2A29O_G,+(mZIi3j/W_:[#Z.5_pQL(_#1sOc]OπU"ptKM=Up4ULa$2/7qZO9RiD024UKe-h$(D4*WU(K0h6P#>cT)57g[d9N&cCWzIvDπU"$0MQ*/zoB)iw2zNOUQpanTu=_,<MU0N)=MX7(NcI_Yhj>yEZj9-YUYhpjYI42T%πU"u9m&&m*VwPgRYZ*jbYQrL4yeOK\FxBS:Z*/*/uKGxOBWdY]K<rk8u_=2i.0iaRrπU"jmEM($ZxHBWy4e.Zd7,7;\z]Z\Q*,0hXu_=>F/f*mfP6uqb5Lu/E-scG-dReok1πU">8,nhi]MD8+Pw57:3;b$GX+4BhtvR:JqxscK?zAcCX%qE&y>/,[s$KJ2Fk#+:iNπU"mvVQoM*?PFW5CG8#Fq8-w^MUsp[9#QuhJH<nw\Zt_<ACuskd*/B,N_Ge[J6NGUhπU"$V'2RweFAA(GjDYM3?z:zIqIqVe&KK+qhe2lR'zR6P/[b'Ff%DxWztcn.A=N3Y'πU":<AWnAi=UYQPwBW\dAir%>1;mLApWFti5=<l_H<=+-=RqNcCJO$cBUu-9EuN1FKπU"Fa++jL1zrN/sEc<&M1R:zeu2hZ:PQ1/Y*Z(^[%4:Uy_i%yu;HsWanKlZT)+rNfHπU"08<D*?0'[[<ktOu/?#y/<PAdZ3DY,Nbz3-LSAC+qM9uy9;CQGhJ%Riyh:CyGgh%πU"cF1yd\suS+]?<bmwQDYY/i8y/K^db4(J7fxNf=_4$FIPo7ymom$r^a3j$mqz$ahπU"[nV%1MlxNXBEvHWAYOh5iOP<1EZ/K;;MGEDHJPbGsW(.I'/S(tGR)2,1o_V-?tIπU"sSzf<tR4?-l1,<6fP&lo\JA^N[?U%(Cl*_5bu_FGF4#Om<=/Bt(bFj*GthK\VG?πU"/')<76tERY^$LL^BqIMl'm8ceeyk9E?sv;07J/]4#DS%g?7'.*-,.r7hwKdFk6nπU"$vP/j<J1*:lk*&n^U;K5,?MzbC%j.nDm?z]*65gpqV)n<$'h]k4vO[X''1Pj4upπU"HXiHkxcIt$k&BWlBibD=[mA-LB2g<C[6bdX?csF&8.uxW52ES#sepTB+GlTB*8fπU"=\(Buo(0Yk&j%ESoLixs':k+4oP29bpC<O8?FA$3shPu.ZwS_K(&EVK6h;^_gUuπU"$GZH&tI_5xMBA]$/Y.>4D9\r3Ill<d/;<&<S2B;El79N\.tYFGLK)A<TqfDe[r$πU"BX/=4Y7RXEMDV>?Xq^lU0nGcv]aGH,jcruLR5(pBqr.&2Zdhg*ACpjMWjHtprb2πU"esLB8[wcel#P'X:/VMA;ipFYd5/42cYXtHouq[Z*>6\wsV5YUNQ5NN-c4lIg:dVπU"N<FtJbh<vEr%NL26?,B0S0^-\hQoXUwOqu6[En=K<LhbG2m5d1F_?W_#O=Th41rπU"hV3-lCNlMbbdtJndi?53K%'0%4TST$R5MrnIt>N<UFV)&B#HT;)0gZ>u4DM3PmIπU"$-ZgXIi*oatux']oKL$&8mfFV:(nr*sSFA#QP0<&akmG10p?EwiGsO.EUPrIVa5πU"cU]G-=ehF9qr^%G#M2Ahi'd(UqwT;py:TnUQ:)ELZM%O.V]w,8a_.KxSYUJ,SpUπU"^BBw]D0Afqo;hAPGGA4LIxK%F%V6_SXVMu8U1,uf.>?.LbxiXGs;1B;2O[jQusCπU"RBPQ;[nbu9tlcjuI.1cXjFP>o-M9Oo)jLVbn#WJ#uSBdZ:-pgeA#,9Cl;QM^K3:πU"f)?lk*Yrn3aPMtD9KEh+t[J5L^S^%mcD&\Kr-U-0ZH3.PK-[c/^QeBll*ekrJIKπU"q'7HZc_h^e]l$d2(-<h:coo+;_]+)\iZrpB5YFQwk%6y9'SlNkNZUx9-=I174?LπU"<NFAu<j-/qh=UoU6f5H55i./f&A\,cWd6+wXhD%g^H55)1EpjmwNja=C.0)\;\RπU"T2&j#c0NmTc>E700;nr,<F=(J)UlPJ*wIP&CVa$QX1j5Q0&&i.AoN'%%ZeP&T-iπU"9i(+'n%IPG/,+(-8eKtq3iMC&^G+k<ynrmlGe6%A>7E(ZVKgxD9b_q4LDt):<S7πU"2hb3^xl2Pn2:Y#i>RDW=3]SD5H&cS4'$%K-qqH*=/:'q-h9X,Ogu*p?Px,TL6KCπU"WMkA+uEB=2LfVV-<K^<7Xq&:/WnW:)Nr7Yhq,j<p;bIDEe'b?JHn$x$>Ks0e#6,πU"^k:9F+Nn&I:-,+:d^b>p8VUelZ6iKL2<vIXJ,p+\4Ld8.ePWf6nzhho1dmet'&(πU"P&YHT0?rwpoAS<8qW0#l0*F0I]R_kN%K^z2sHBG9.%Fj_gkklJny_BZ/5tp*L2zπU"4e/_c*7+sk;&uEgm_a(ixrm6,r/SKKJ\?4i/FAjElK(dUuri.S;Y#J(HDn(^05-πU"QsJT]m#hMV9R&\OH7$/q&D_lpy6KWt(o7c/[Hz8kG'y&SGFIbZRXqx0Ude#9#VXπU"Qmd(pn/nf0dT]5FY*B>a%$v-q4\)^bruQeFIXd'&E6,=13I%VYTt1S5^Z[h/[joπU"id^4(fB]=&d'SjLEsJRqXGsLL\a;OPGUgX,DfDp]$0uAfN-H$k\k(>1ceN/m#2zπU"I-M5Y)1A9x+h*I97Pj*]eYJoiXS>Nv>hei9T(GFu&0AsjG5Sy1m?:XaEmScJ+E1πU"BW>sj+a(FYG7a*Mpc;1Lfv&]ogo(/CfJpjY)[6ow\z+M22g)%k0r&#ief&,9epdπU"+9c]*[6Pn_]YAm.Xor#gOm%..iCls&ivPF2]JIgM#H&I$<#6Ci:40r;#>m79WF*πU"Ebv&,vJ%y=*fdg*\]5+L<oMkD^;Ir^Xf>6)r&Nup(%)9%%%%-%M$/%Fl',.?e%%πU"%%k%%%%.%%%%q%nymW%SgfyJBu?Dloi&iqFB\^dwu?o#.+v/:FTY5%ld<*&vmb*πU".*DNl#<tdF#bbb_MCob2W)v,MLuwnQDv.m_%dT<%%up()%9%%%R-%_I/GE_$6U3πU"F'.%%Q/%%%.%%%%mz%rfsS[ilnfec$=U[e5i^&3'l0)?OJ>?d$g87]#ko7o1q-pπU"c$g[/z=?zfn1NDXZ]EPR0P'eeKQ%psY$PH[D44XpdNtmZnZDNBvPoc?4ZlVSe'fπU"5K##-F$+Ts'g(=G6gTto[YjH1ZW<x;t8c-mlDk3S4ki_HO[2Ue>?$-,#d>U8W1eπU">UdK$(nuf?<rKDl1z'<YB,l^9ud\a6KW-K$.n%3DkoTj0EA:l+r:s8fKoE,VvatπU"G7^iJksZ)6IA:,KDv_k<qVN<vkW,4Vs*ChVSc7VbS?ZeWT\Q+CX1Hqt*=9.dFn<πU"gP_FI%+3,UAD]PY6hO'(r/GDSs?0m*C;jc0=/,)parkEq+TjDqi_q(A'oD4Z\F_πU"EUptr5d_^^A^Q7*##+RO47cDa1%s*uheJno=JcM<r'J_\2An3q<HY_lNwacg)7QπU"^0%r0h:0FRXUph>fNYGDV=lj;6\X8U(U]*BvMWKqSWL,cODY&=>=0n-M?2WBkBLπU">,[54Q:t4$Y$k2G]LQhfwdoq8R,IS'1j7<^T(z^NHn<0S;B0CaX4a<CPT6P.q3PπU"EdUAG9Ef>D2pYJ#nTz/kM5^p7=pEbCK0-b1i4;G+a[Oq8Z#\nbSLtqIL:my^Qh,πU"7-V1npp+<&>rN.4EoeHNeBVJwZ-r,j8^Fca\Z'RrN/mC+YSqe4fjH(nzD4nrS6MπU"&JKSkJ<239>3<5+dn\?o,-8skD:zt+EBA?YL=#h+*R\]IucDtOr]wRut)Yq6cR)πU"a*IVbC9u]kABjuP?eZT7\Kt#I79kRs&GKuPKg]p>jKwA&pfvnx0YKvB:'8&up%(πU")9%%%%-%5k.%FOYxxB't.%%&XR%%%/%%%%xjqj%hySgRfxF)<dB[]+7xczKrDC;πU"T/KM3N$_;2rY=hCd&8w^FzYqEHcccG7e&P]Ie>6Ulupv0UJ;lg,zSqcqoe3Nl8gπU"%4IRP9^>V<j-rEIWMrhOV_k46OPE0kea0)I0pE;$i,+7'I?)a7o'KO9tC(htAw?πU"fbD?Q<dzF&u^BA>V(8/m^O8>MG$b)'ZUKgE<?dkHi/l*Ho<keQ8UQ(CeWsfcuYbπU"b5IpS/a8kXq7YE8H'5t.jX]<t.74&_PB5pF$/1)q+Fjj\ktK>M1f^K-Y^Zt4$5\πU";6qN%mUBiSS#-S+d\DXoaB5U<tJ5+rAlA8=>ZJ3HjS_N2Y?kHpk^+(kB?c#kEn'πU"ba)JZi]uUB(Xlm?0=#Z\:[>k88q9,>f-jq.1i:Z[mdP?XS?q1ZU^kL7fJ;XO47&πU"l0HKpU]c0Z;LN.'aO[6&%S6\:G/?IN4NSMoi=BnNqqKip[F4RC40^3M,.2e'Cj9πU"pI&-r>,w;<T(9+Dwms&6ii-U*6JV7gKQob0:NhG=gh6wOHKR^SZ9Zl.QrS2ROz]πU"+/eGsxPx-Gm%-_p;(VoWkTmjSWaCHBJR6.=II9h3]rYYmJqJeJ,D\mHI7y6DHA8πU"Erub[/YS3O7L_oHO:\2xtDQ<62dB8,,HVl:]X?4hDbRerR\/P4q8IZjAH?ls+lFπEND SUBπSUB V5πU":8[Pqch%bn0v6O;<DZw5eKnqrBP#-QgV?9.TcRQ=AaY.rMc^(_p1-6djIZF'/47πU"uNXs1+MP&D9Qpl5muO6^O]]X*Xxem1Mk;uS164]N90TU2?-7,yQ-6u1'k)d*OZ1πU".uh94z[^_()q--J,3SM=-A3A-AsFE$tAEthVOkDVPk,Oc3\NQN7sJiJFQB9[ZU0πU"u7.e%%1MP&N%%#,'%%qC'e?hdU=WBcR4tH*U,hr&<4?rN+P[ByYHaejqg,GnW,<πU"oQ^4,v$4;=kSRn7_NX)=_pM2'BWs4gUDrF6CU3rUeY+N*ud#XRCN5Ih_76PKTg,πU"V>aR[Upxu;)tk.w:Sy.3M<Fc1dCO\F#z\=43ETASkc)KgWvGo?.,CbM0>Y)GG?fπU"zg,Sl9LpII[^$lMC\RU&4<X]#Y8DbOTc'><f]868N9K<JS:1i%YY[#g)S\\W>a.πU"GFS5#O8gE\,/ZdOlJ_QDR\HG#m&CW'64<0V_=//d6K.:=W:(Et]O1Q_#Z60LOTBπU"-$4T'3-D)ug-pPN,%f>/OARf>]sK<UUlZr5Ff6RF-#sBj[jM-pG(qw</.eV$?.uπU"Pcee1KDM%S,f>./ORf^>]K<:A\jxDI9f,g_j5+_,;'^gxqOHEjx%rR/I1jLAq-]πU"API-;)cpE*trDaD5HC(l\)g-PTC#Kc]G[0r__4b00;OcemQF2,A=^+aFE)vU/Q9πU"[Sr<kv+=nLFX<j=2o<D&NZ3cbJ=>?P%rC+nTt)(f1&37a5roCFIc51MraR+<J9VπU"$J1q,u(]NS-yPe-7S^pViQFL?FjroZSCPkC%.m*3r)WeR8wr)G[:jSZ(/Z:c;5$πU"+tm'j7W*As<3l4b8WYwRQf_*i_(pu)gPN<cOEa><z&7jt$Y:BK:U:*[y-Kd;$R0πU"z^TH>G_y9i_^5(m09_=0,30UZ$wI_VbyfsOsHZCw=P%=THZ?0EJz*Mmq3fcKV*PπU"PkTd5mDIS?_c8VpGt3A&Q>/bWs<We<aKTr7Q#jb=;XISS(WTM^KD5'zqd*+9'H#πU"HO'bOoS1[T8^9H=Pc>1EpUmV'l-nHnKN->OuZl$&$VFM0K]3[WO#j>lC2:Z+F*^πU"PToerR<b_QRAj7GN2b+0F*Zzh1^fYh_MJ,-F6D9Y<D^s-eTFTXhS4e]7hu.0#;+πU"_?t*PD$qods6<xK2HwrTM4g\^_feY0EjrgF:LU+/DmC%g#o:=U\Dcm&#S$EULAdπU"LhOr=9Y0X(Io5#wZD6s(fWm3su%*#D]j;9^qrJjXUK<4(ucC,h[;qYhKCJ.],),πU"AaXA26+=ZhgfCwK'XlN<u_\m,Yg4>1[cCt']Wnp^EJX-Q=-KM4pCue4D+]xIFWiπU"cR$Cn:[d0t$dL##1,p:)]kV6nnADw=a/B[#GnIdG:Yr8YmEX^wvsr$^Q4,8(*bVπU"VO_z\#sFeKO3F[T];'W_^zH'^AN%wTXlYcQrS$$QkAGe9JNt01ciZA7M5LbS/#+πU";2R?X0iS0ckfCmuskHR3gklDBB5cD6wr/Z2=40fsp1^Egl]aiG^.4BYx.NT6ItbπU"S%jH&OJ-6Ml-]$2C_g=kZ*m&8kB/$_AoX:6mkiYdS8ylab^Srbqp_^t)f&rLn-LπU"Q.g6GBI/Om3wolv3jMU,r&oab+4S>jfh2n,^8DtX^/kvp;Mm6esfnLpa'$y8*8MπU"\EhF\fMOa7\;K#]+fuP1:1Bf*cO*=W+DgF#godl&wm:CUW-fu#w8ixO&ibF)+xrπU"&?BrS98jN943ac6osudmGF5GB7Y=7dKzH&V?J^-q-SmifX,vdfS6zvpf&0r?&&OπU"00R6z$scv0wdt8:6n?B,s$Jj?JhM*znpOD=c:fNI4VIiR>P:.-^)]'bHpR06&uNπU"+I)bqK_nWnmpUKtWjGD<1Dy2&Dl/W+dV1YPGrI#YN-D**Y]1KqaMgVQEHjYIf9nπU"V%CeJ>kGKU?V.C0kt30K5r#SG?_cS1?KhLerja$Pk4ee1:Q2B$:We5'PRGxDO/QπU"^n^30FKq/$&<.G.ZIf%H0fMBYdQcfI(95k8]3n+PmP>e9/)6/Gx\[>Ubd6492L(πU",[s+&)T>/kG9]nn]S*bK+J$lfU7f39%do/bH?3i8AcT?f+*^(T+//2IG#fo?YA5πU"+LZ*<aX9E7>2aT#HeyB>KO:qSFFN,n+WaQ?TaSAg:aR^KDqj2U_PR$[muQ*#e=4πU"xl2hCy/UQf/Gvi'F+OsNQ#iN'K1^3NVYd+/uN=8Hh8*sORUw5Itqs=3l4I>D(%hπU"HxX^-<\Y/ysaempkRi+WqTr8R^=.1sVj\jDL>i2A8$*jfMte)#Cf3ALDQ_bW60%πU"n[l65pP$>e1FJrd7^8VcZs:$/_*6Wa>Gif[Ywo4vIFW+k^e(30#PmU>qmAS8aIuπU"vY\#_^dx(q[EHd/^e46FKZ/Mou7gAb[eEm']#lq^trY?k1/)e2eMoa5q'x<Js_3πU"5c<e]/FvN;lfj+G6gq&SXc](rNP>]TW,(.(NafuKXu,Rv>GPXJ%SW0(+sq6*.uAπU"Ks<brCixgF.NK*u;^1:pW2CiZ['%PCPAu2L_u>2POe5?pxe,NsPKPFkb6>.d5$hπU"8Bym/Dl>yB$To((r,rh%qw+6t%Dup(%)9%%%%-%h)s)EOFxAN^#&%%Q%/%%,%%%πU"%j%qkSimlnfM7rw>Em1%Y[fGsv^jA],9FB<Z+_IX\\L&I961)ac%YPcGTnHd?#[πU"l/9s?nw*QtndL5sRHxq[P&AbJnB5?jThLXOF8u48bPh,V.T[tnS(km*6B3TFo9UπU"kB[B]vQSUo8hdr>.0D_NOtiD-^=Bw?D0ek.h2-D#z=mgghFS_A%Q^PD)]l?b%#=πU"(Le_dM>b5;56Bb/C6,I3VS&tHMW+r/E?*?1.?=Dj#q7#K/LL1=B'8\Q4^*)BMA6πU"S4sBSHtE2B8Ra.apCLfA#h]wVB-OCb%Vt_s:VEAAL8;;G<J$RE:79&]fVE1m(<bπU"V4[GQLUcW(oIu5;t[.2<Vv4Q[?U:?>Cp*v*S4futG0m&sb0V<jc'5,q<Hi(k3_qπU"\&nnn/q#g=adjP-\9l/ukaH2=+g\$Q(G$z^<N3Oks^8D)5N_Ru'*9.FJb'=c]DJπU"]J<B&V:P=1=s_gqB^?EX&urf;-%,IcEUrv>/]3BAve:1lt;eb_3(%44]>Vp->^1πU"Fmu%#up(%)9%%#%-%c*'(F7HAPeB%)%%k%2%%.%%%%n%sywt%SgfxNF%,^B[[9LπU"Fl[d+_pE,M[1G.<U1rVdeO)WCL%Q;v34>U=9)K=MpVZqp*.ltL7h$ch]N-N]6sUπU"Bd$GDAD+CF+PX#OXUG/JvWFb;G7c/cZp6tKUJfkV2Qi6m?6-/;C1ZOYE,qJ1(cKπU".nW#ho'Uw#>P+JD=PEy*PceIs_ras;QR,1ZnGS[3g84RrBu6?U1i:W9sYuz_Rb8πU"e2wW)mroU\]KX_]$kVbhVTEm%b.eSBeoSlj)OC&;J=33r1Seb_\>P:v4M]#-/FbπU"^YeBYMJp^QnQ=au,(g1'[V,p2CjH2cPePl:P's%=j=SkW)E46VYEZ3dI<Yq*BG5πU"0,OS)unSdMkhR+0uXfh8u9$(I87a<Pb&hB+DQIzmrJCYEbp:-lM#JRq2U;WbG-HπU"L#fZJ\dIZ5LP0.bPT$i8_a8C_;[&kR+;mYaH$,ooSGh\Gg1kJ;g.]+Yv;YJ_E<_πU"7EYaQ-gjulWPoTM<8/CJC2U2cA'$p#eGNs(<qp)NeO0R*/>Fb^,mgM/LmhCp*bWπU"bIOqFCLLl^WC)?9BpB<>gA7PI^I>n.a[-/*IKH%Iv9H6v/XgP,aDC,emI_z[$e2πU"1PJctNu3MhR3BE1&:cYf&p3L,z_-C3$zD1Dzggh,L$IJ27yo,wk'7?Wb?V9YHPBπU"\[3MQW\sh?esC]SnQ=YOk;X3k7V/Z2A.\9TpC;G4IB3TaGQe3e%F.=A+n-*GA-EπU"Y_QK#P4rVZJ9N.TGu9w1BKJD^3UTp]iO$g/kQ(&[k&N&BX[\V1c5;QT;\K)g[]&πU"$+;cFwq(Vs6ZZm/El#ZMH.B&gvSkddb_1Y]pBteAQg1W.,dqP/;UGIS1FRkj>o3πU"Ng/.&Z7h6qY9Q(8,\cB-xKDnHRNB]?>[f?uQJ0>:JOeZm*+:7,Z^dhAx(FW3Yk3πU"YXS8MK.Jj#bKS$Kr-.:H0=ocrnonf[8X1'W?1Va0J:r^WxF_Q6tX^C]/?+L33JOπU"40jLvqLXh*?K8;:k1rInaiv6(Xs/+,Jm?T^:P>mWB76b,+h+dUM7=*1j(mYK7;BπU">31YmAlR35s;Z'HiQ^=RD$NfP-qO\KG6u)8u<b+<B54G;/l<^;<N<=$QFJtb'MMπU"pZbWu2FeMd>T%Yri/KIldO:(4(#TtFxL?79iI+7AW*lsUle)P&A)TY9j=T*hFZrπU"2Yp6;-\5Yw\jIV%Kh;u5jJx6*l8#gk^%^P^bhNAvoga2^hN8P-C%V9<H&FV7<5rπU"[1OUS5g1dKS5:%JNN28n#\4AvIi=)e.t.tZS-.uK-2vJv0ZI+rWBF6UX7=+DR\iπU"%Qoy9lAB1>T._+r8YmRgLzw;xgI%ihixGS7qY_N:-2(1sC6'=fF7IyPnTF2xr(VπU"]?VWKaZbGjrCjXc8uR[C$U[l27X8IrsKSt]l4Xx%p*Sxb&u*3a9yk+1$dSVct>cπU"_syA=Z.n82iG;O3O3=O3oG?/,(w*u%p()9%%%%-U%q.%XF>3E)be-%%%wB%%%.%πU"%%%yny%qjSgRfxF(q,>[AL7L^c0xu1W+GaW6J<E_7&6J's2Qe/;/k$FCa#4(O==πU"TT[uBE8X)y=#U4[rian+9Z?0'_,zV,L3+,xSpT8U,H<kD)VooAa4c0F%>J[p&PgπU"a*)7:8).9h:M0]J7pUG?Ke1/gs%pvi%n.DDXzP*_)_S50\.].E9>'N<;KTIw'=nπU"Mj0sP[77T1[_Qi9TN*O-'sW1)Z^fq10i,>q%:)t-FxgYm?d%M;IW0mFKuBojW+aπU"m7w_7oC=4RgoZaO.Sohm^Wt/$kWAQ%&LETq'ZX<_niXT2ii488sSwCT7Z*VWOG/πU"^'hFcjufp9tZO]tCt7$%PQYP[cUG+,g&?va%73pZlR_4ipld>$H/N.&P'Rp60ciπU"6eY=HZqAMfi;grV.:<(_?yQh/\?Y+*qIr%^y+=Ggvv>S9ORPf]t&Ufr&v.K+lFcπU",Ymmt&hs]<kMqSLmKg'iVUiq$Up^HLO?q:chH)IG17c(FmOe5]:9[2m)mS-5iG(πU"AMhDd(*i+z>VNV(2g*Vq*(kW<DY<+b3CO=RohU2)Ronl2G,#fL#C-,:j[V/\F7bπU"RF[YP[IbDaEQnJqoP9q&NsJn7H7;R_$*/gkrQYxn+js3;szsw/F;nuj^:Pt;O.[πU"L-w]0Ah#X.w[HN,[D6QHK3+)KSssZYcmL1^M09Era9xvADJQ1+S'7P'?[<Z(7p7πU"74]p3,1h1RQd-#7Al0oevOY9inimO21+TMa+,IT;TlD0><mh&Py(H7#Y,f7P#-pπU"ec6lbIn1L8Bcpp.9Cy5i7MB3?Qb.h->*b.qfH<^;u#$'<CAY#,>\mSqQ(&a?>L\πU"7DojmIC<U/acfLsgn)vu^+<OS$dQN8SWFY($:7NVE5.$wW%D%pP]A^9EK,T?p]+πU"iSwIn:>=b>-lPGn4B+r;DncgZF0Rwmn-:Sfp:nm?&jE+S*Ge&Hq;32m1YP=i=L#πU";qRS/'ZO7_M+qc2'B-K=pV[bH?K_/+*.x=]LTp[m5KiNlr\9jGn.oV,k99\6$p_πU"zWY\l<idIiH$rfN=1w1M+Wj;aG:gRv1:8m8c*sTx(<;J\N6fBss+1nklOE^i8/iπU"D/Gl(U:Vkc_P<f,iJwd?&4KUOTd-1cluP5n/2z*QLI^em;R7_ZHEE#+Z6xouR]]πU"FoV:HIyH0[0p\y-d]n=1s0g<3VU?NAc2qoqNHNUT&xX8]=mK_FzhRF_vI>rJoMhπU"I5$td=2+Qfnaum&DvhR9qANIm*s$E#+sB.HH9vt8t1anu:Jr<YX8BNJL1>E(ZIiπU",E%VV][8SNL2]^7rdt>:MkpTxN+x*_q25ullfD]&R=U+sbfT)5MDPDTp;>\%N+YπU"RJq>u<*2SdPl5j]'oOpi15\b<6;9M+IZ47GIqGB:pq*ka-\G&Z3Jp.CM6grua3oπU"hCep$nwhrqq7/:0ZTZASi8x9u'\tr7.JeFyE3]Q:SaCvM[=kV%>R=lF:1W'M]Z8πU"CxVGhky/35F7$h$L;&TD'(f7R_GcW9/\%U6=f4w=tv;]i*hqW8BvI+QLXfr/<DBπU"Ce't0CU2<\,%h8.\X0]ZwDuMdw/tWg&E4\I)btbkgEq+^rljm)sN$bp^<MY:dIMπU"VQo0HdWom]$)A]p>jcbOJgKt*POqtG2RvzP&*BGDB]i6ZHR3rV<EMYmRBiN]s?IπU"7AN]U/dC5Z+5s)/uh?Bg&?ldyotYM&dPC]<A4KX=cf2dr9fUNoU2I3XWMnIT66BπU"pC&CPsE&J\jrZmNfl>h:#PdzDkCfep$C_YKefT8X)T^GlaMdmf&g]0,;G9h1u(,πU"f<c97Z#mUZftlb1;hY77Ph%%psJf4-AtdLhqj>3Mt3Gdxz?KVY&nMku62gRlF<\πU"^YTV5Re%p?xS+z1k2,re2NHv8Ld-PE4qk6:P9]ijZH8RNJ?;=>xmDNaXSMTY9PcπU"Ou0''.NMe>(c,6l1&)glOUpiZDfWRram;$]OM0*ZMW.A+L_:;4#Hp_$,[PAJ(ljπU"%(moE]]RH,O;lO$HXvPDTJfQ&JKVPB&qB9FhGbq6<J0YR2t5?#Q>PXBDqQlqmH?πU"OMkTZU_H?Gg(,G3_HpU/kk*FSJM9*K4ykLEb25PnRo=\R+whh^u\nbp1'8K)EDNπU"M0<5Z$pF-\hGuw<a[KNANKN-xd-dMTyv2t?Mu.dssR?;e&JVUCdz'H#=hj)myjPπU"yC1nd1EzG95e%]jx>(RuGC]KLSEX+.XLfZg?YA42:-%?ocL,hsXT5D]$r;nB\HOπU"+(Tn.5+bKTnt8Bx#Jnux+];\'D6#G+jBBT:Db[Xa]rKTrsBZfm,DD:(xEjj?VX0πU"6TtGlRbJ9QtXZ&w*U/1<p=%i)5rJGwNzdblW^P(bP(RDOK,O5I8Jbp%\6P7&Mb&πU"S_\tL:%O-8<YJBWTX,QRHVf)cU=pVx*NEEzMGA_*mF7L40'vVkQfD8bk,MpN-;9πU"=2pkJ'iU;UjtdkgkhOI]O)0f1xhsm%JCRFzLNU%;xJPrtK6:^_G+K]gP3a))619πU"Q-)+-jojf5Q*\pYiS4\Vq[*dIVmU,g9v1F*&_/3e9:T/5=,B:r:qAre%iHNKc94πU"EHu3ER1_jx9rlDT-gwDdCG*Ox^S[+bFZ+-Gmny<8tYzVVpm_b2V5p$>8\z?]8n#πU"sl0U.YJ[D&Jn,Je0pC&Tq#<dNAU+0Ty?iBsR:.TOQ;xeCEj_9Zt.z=GV-nI\lYUπU"=&f/9q)VI3hWE-9FotyjHxQfw.#[TA_:rBVi/Qr,?/NR=90HLgDhBJrq]qlV\rMπU"$R>cqg^Im\oGO;_9eSkq'='B:%^-*VGEVFg_sd[,y/k^.8ZVFAY.%up()%9%%%IπU"-%;pJeE<E<Yc_%7%%w'%%%.%%%%qn%ymWS[nht>e_VA=[U-jB(sEKXFS-z9Af^kπU"]h_5:'eqHxF61j#w2y0+7Ickal5;cOJ'u%F)<JbbaTX-kD^FIZtq5:/nCsWdJ:QπU".a4cBwvGW4P;4uT3'_FvxmDm\u194SE=ip]gK:i&)f;E8(ijCq&v0*imWJ85k.mπU"OV7J#,8$JW5L(nJPY2p8Y(aS*8ykLwSqZJ),7D9Q?E.MR*P/ym:D*OYS'QW*$,&πU"U[K&Z+#t14;lWt:fUm,Q\5eQ40ia=G4?THV8#:pOx6XPXtOKmJp.^c#ym?V\K+nπU"5*mE>2MxQ'Xup(%)9%%[%-%dDjVEGTO&,x%'%%0%W%%-%%%%q%nymS[ilnfTPp'πU"j[U9+Ydio0a2(SWunusg%+PbWWS5BVg4\K,y#Oc42##L*3WixCn)+1#mmc3HtutπU"PHLubkvm?f#BAp^A]A+6Rvhh[L0DbMQS-nd/$Lj/-eCGwqMs]0/,uIvGy#$_-]sπU"djMak1,[#Yt/?7vSODcvFyIO%-8Y%#Hd\r_h7[.S216[6Dmt:yqmdRtkq,/b?7hπU"p+sSB94We-:4N5Z/o$n8R42OaH;pMePpPm(aWEelt9a.BLr3u_K%e1+o9?<(pwDπU"(q6cMMapS-NL-/;+-'=rgYD.q=j/6Z_wS;>x:P=qxxd3\Otv1_NRmjP\xSFHVFJπU"+bUsZs%=m#*XXLTb*4WB8WV'P0[b8c^M%pqj+BoW%Bv69j8xt2Z'UfVqZF_9$V6πU"GY5R7c0QtNIgbf\bKq$wBD1u]s3p'Pr.csJVpZ]7XP(Vh#7?cEw]n5kH.fkH3/VπU"rU(bda_T;eu<GZD?$t;a(xHaCW(k7=hX^&teILK%N$tLGofmtgWpJYZf74P=jfcπU"9T^#nw:ptV7t0VsV2UE.uL6Y\Af=RPPSTfhWgE9Vafrbh*6RTs-N9xNXYYjrW-uπU"?]qKRiv7S1ug>'Yc_lPo/H9$1d:Ie8;;p*b^cQ]sti.>MKr=KES[/(9Q<U3Xw42πU"osT7Ns=gxuR>&8=RIZcV&BqWc.pJTJn,>YZXDKjanKwbBLoTaXHZiZWl*2N0)?(πU"GFp29i04'Hbb/rr9B7j_o8&h0q.qPU809J.]y81NiVRS-q(TJK]RR<k8-UX.tUhπU"]EL\F<YTH>g(VnPHPobc:,)/^p[GM7N.jvp9<p:lcG-nXrrkk:LM9G/bBX^]Uv$πU"ec&Nu$\M\IdCa*^rBiGZLk;anp,%up()%9%%%d-%d.S%F/k?;8[*7%%7A%%%0%%πU"%%tu%ynts%xSgfjx>(V,BS]5bNHqwAVB\leP^]*fu&SG.b5?7_u/XQ,8Sl&?;jMπU"=p+k-v9ht+QM20fQ4phGeUP88M>zV.*DL6aED;?DJ^x:%4<n:-e#\2s7GQI*0+-πU";9i.p5<f/C)#P1-s5yeu#4Ca6LC8Rk)V+>.Bg1gmWN5atr=xDU_jPWdTY_sW&ipπU"3NU^TS;q7a+:xB:S\N*'TKTkl+s*tNi5t.Zd#8]AEpgwC>6^8d.YUNF]4=v'5SIπU"ghafqk/e..BG).V07+VsuS];Pg6-W[^#n?=qJAYiVt4\d,5O,dWa9X-WIs)W'O8πU"*+kJ^E06^X/t:k&TTFY4faQU()0;i;x5=2q7KIr5/ipMF5=I$M/re]\I_?b_'c/πU"Bm#.bg;1]_Qq);MK#vtlr15s6A8U85F0eQK?XUCYarqD\G$0SiV]dP%0+d.Q#G_πU"GKr)p<f2FF.&l>Evh?-KE+EH<%\OXSVVv<[ni[l9,_ed72RZs=_(T3VI*hKY^ozπU"sO^8TX+l(K*:s0._rD4'on%x95vWc7[ZFz(kFZ=]fm+oi>t_;4Jc+2j,GLA#oLWπU"5HW:q3wSXlD5%$J;wCTA+58;*B+dWSu>9+,MkShJ&Q4J&aJ$6QJ6JaJrQ1JraJ$πU",QJl%)pnkS]nmi:I2X>m^xIS[n[$v_m6&K^?O_U$i3_-RbuUXS42Q+rr_n6ab8vπU"]VFme[OdbfHNw%PNHKla:J9P;#-k]frCxhw3kW;79u=.55AasfX<nHavg2R/0O.πU"j^M%w).k05JgJ2Mu,98;H&hGp6\^AR\Ab,^],T<N^O<^e5(s5^Lj?fK_DqkZL<&πU">mf0oTo$cMW8lgz0RS4qqF:A%hR26,JeY:Zhh26EU4]tCm,AVLXK8RaR\,d>:vMπU"4RE/,7ap^:qP)&2Ai?\n[ZjI23ICv&sT-gjY=F]u=1c5to<Q%kh:>\%7,ivm::$πU"IuCUlin3Z.EC8Y$Rv-(\+I2iDpW%l7<gs&A:S%;\$:+p5e$fX-2773>CLCq?*jWπU".OxDJi[K,HObbM?nW7Ok(npSksi4xt(CUq4ZFiEzE333ss.<3oHdBei[VJ%&LiWπU"(lk'AooOIP8sj/T_0A't=mROQ>b>ZvrkzMi24Gp2('-i^k^08sRu?>=wrHaGiX1πU"Pv2,SrTa]kXB,;pDyI*c3r6n%fwXc#f5R1t28en241Vm-b;XTwSz?8GOkupQ*(cπU"#Jg*NpUKqX4MVIquqoGTJ2UT)SdEsDn8P.5..H%At=lJRR7h*%ki$YG3m;.?]8MπU"fH-eWJkB*EtMm+2e>4.b$PY:8#q/vh(GpxTQ#SoB=fAa9_1h76u;<nNukmCnX0WπU"*Y:PJ&Zkg:dn^0ip6%$<5L8jKBF[e1Eslli0pT]#'bB$EIgTQoC>TmQZ]jA)?[jπU"5y2TaC4MqmR95(-QO<Ea2dC)kR%zRgE0QesLlRC-G,uX0CAH_%A&QV>[&PfKrNFπU"M3a9IY0D.FrwB9wq9lhdK$DY;l3Mv#b0WJvD3fcOs'ChtjjFf3i>1glQDubpfCbπU"1G=bl]ZtWrdU]XpeoF#/9tZ=CGX&3Yk.nii<h7j^hir2BMdj7heDj8VzY&h-e7HπU"bm*mQ2+Y/1ZR'X%r-Z8KO+/t4PwN]2/'z5m?OY>sgB-a[*K(;F;NWj=TAK<E3['πU"j#+FoC=ncE'M.Zz:rGil_eqniDGuX9)/**=xLWmx<8ffJrOE$KSfNsh+H6NJ(NEπU"6G>Ht/1I%VgmRZib^/1uIAFW%e2gp(-[6?/K<PiNu6SJAL7OuHikx&T3ZFJynTTπU"KmSftii0QBfRI53.YXs>WHP6V:R80RoF_Ke2%it67R)gEakRYlM8^)Q/Gu8.gu6πU"1R>o%ro-L#P**glN]ItCJANo+GfIc<nvjhHq,??xxLbnesrhnK\UT<brlYC]1%mπU"/k=\6sc.u%p()9%%%%-U%?/%FF?#()ua%%+%+&%%%0%%%%tuy%ntsx%Slfr)d_$πU"/'<U5i;JRhUew[Z%5^H_YTB>m>u]1Br%FGNGG%:5da$lk,FPo,E;^v+;(z(A+msπU"Qvm__wk;?>A_+2D:=DP1CT81/DLX4H/LU'k9MwJqqTg$>mI0a[SGvQl?S>AIsVGπU"c7*_rV.B&1cHVjYZ+tJH,/3P?O9W#<\Si9lhst+=uvOmD7zQda'6%up%()9%%%%πU"-%6;-_Ej+pW]'F%%%'l'%%%/%%%%wxqn%rjSiIlnLa7f3;eI-jX0Xn[O:3wJGsSπU"&C9\bXidM6O/a_l-5PrHY5DFZ,$^4j\Ti4rTx2e7dbZf=9b[%M5kWM08FqnU)]KπU"#g*YtX50>B(Gfqv&SV;c.P/<bQ&kjW>bzoO]Kr9bCA1DrTRP)r)c2(N,=Og6P0PπU">^sFAAaU[]gHEI4Y=HMyf'21/lWuEN7>I(xUtJ5.sjs<T+Qh;Q0G>seE4fm?vZ2πU"I)HdyWZ,Ce\*W=KT=Tt-Arn,ul<F.OV2puI*,lRx&*,du%p()9%%%%-L%ao^FE%πU"kZ')K'%(%Q/%%%.%%%%ijr%tsSimlnFN<D\UU71%I.3)vk'Ih%VO%#nfwR2&/TAπU"<m2tSZ%Z.WM6+JJ[3mP'nix7t4xrvWjG5Nuxnf$?\s(#R%wtiRJmsZ[HuZj?VPdπU"n,<:;AYC9=tIb<\'_4[1Q_HlZV57.9c1UV>RG#B(y8?>94lA59X2y:bUiCbftj,πU"'M$Ma5??*FmS0T$E:#K[7.F2:,g_nQ4GHGl_/?BbS>.qDj+Zt-ZHcn4*+a&m0JHπU"h*Tpr'kqz-0/rdDu\.<ZL>.?:S8)0\8s6YjW\k>L0X=)g68vG86'xQp>GZ^oILgπU"I4+lTMrspw9bn9*IS<ExVEt++jYku*=u(K]j^;)?I?Y4WIvPY?84jQ1BPawn##RπU"gxaXTdKjHD1]#vcX=rl^ytGf&WD]q<JjvGl'5F&4l^%[uFGXY3%F=i'P-x[(7+]πU"3g3$QbqhBc]lvNTbd]z[+a=5p,$TOC7.o6[?OZWRr3OJX[s]VgvEEt$H%bul3]jπU"S*$V%3QDdB\-;'ta,Ts,W4rG''RfFcOe>$RIim.t]^Mfr$A]Tu8pYuhJGtuq55]πU"qxz##G4[5Kn)=[)Bk-SRr/+O2T?gwRi\G1]NkQ:6ua[2ARx88]AKQRy[CaoYmYxπU"$^%83[z)kA63??D7pqg6ChnShc?N0T#=#Z]l^fV]#J+00AL8],gLV*b-D-5K<=HπU"JW(hq*^&\Q;fd$u-N._e1Dl8%up()%9%%%I-%kX#yEqG:&%.&.%%Q/%%%.%#%%iπU"&%fwkS[ilnf'M$wI[V1+Y[Fve]W9fR;by(fAU.c29=t+E(4s[jvZ.O<=3B^mn6AπU"qZ?PIUn4r2#lv$oM_vALrTNps.8r]:E'i+T6]3(E_82I4KW2sPSsHUF)Me,VHzuπU"fSMIT([-&47aUXqq33B:t:oDkmpcn5c()jHJ0zmDWHttX5f[l,=UVXrZ9kay8f.πU"pc+zd)Y1Ceko.n$+zZp3'-8/-&<?Uq:E+s.[HXaiU6a]b=r)QV<a7_Cnn#s]1KYπU"Ni]vX#&UG$D>ZIPBlFaD==[Dkr&jQNt$2wTWD+PtR$*q,?IrB7wD4XirOf,>QamπU"6]#MlE?l[(?iQjv?<Hc7_,-(bl9VL^QUlM;pW$KKhVVl\c#,1G8poW)X_SPHl:uπU"mEK%p&=d9^fx*BLp']/.]E).hpv4VG[kAPOHS&n>D3$+<#xo$sALaKkF#k'5)bsπU"GxL,kC,]]oh<UVwbd]iP)UzLW3ikdX-)Uy&OBBs*,GmnSbZI,CuP?LG$rvs&+htπU"\m/_qAxT5w\(U;E&yjY7L_W6&,IE/,Ynu5B'6Y#.gURs=mQ;jjx&%up()%9%%%#πU"-%P\RyEj_,UI4&.%%Q/%%%/%%%%xu%wnyj%SilnHfMr='<E5*q/6TNJkF<;9p-6πU"/,,_BGOwG-xd=$grd(xHR'0n1DpXWYukKXVZZro1K:2nx^d;O1FEH4m3r'S%m,8πU"Px<IL\L)LQg1wh$XT3X].l6:c]OaQ=lg21gw4ZC3w+eO+q6h;*YY6q5ZmAdbTP5πEND SUBπSUB V6πU"q7,>SYK=QJh(iwfFmG\tKkC2l6[+Nuk'7V9<6ysoncN^u6nCG]PfLTBQ<p#ypIcπU"7FtDrs>P%^ziu)l-/Ivb$dU,7'=(+E4ha08V5t)NncE<ED\Dljc>2uxZ*beOCGiπU"d0:$jrkz$_nXr;XapE4jD8vrO\,&#uK>^-u#:K#iNGdd;#yr(QU?6#]h1s^-GiTπU"u%p()9%%%%-R%;3_1E:nZ)m^&%(%b0%%%.%%.%q(x%nfSimlnFN<J#<Ed1+/srUπU"f8f#hS$G>_%Y6KQJZ8q$;J42Q_[uRUKPsG&$S6*A6I>ZRr7,Xh17.0WSp^PO6PBπU"9$xvZI4+=N4]q0lqEutk/#-7jJ2-;Ag,)v+j(^9-Q),sV%=hAf>'1'OYHKKcVCTπU"d)/se*ujc#h(;=oEzEBva:20)ziE2VEjD2[]H+Mr6.fTI+^\kY6.epN5c&iY*6%πU"m?_t=mm_&epS[w3B0&E1fYqGEpoMP1YQig^4en[-N/9/hsu7k5_mWrne?>;k+)VπU"[fK16?LGVS.lKUW5q#c8C>w[6^z2Wer2f+Z)Np)YdQH>Chc3_CUQ6BDbCBm^πU"Z(A7,cvb&';iQiD%w1Nit\v[0%ps%e\)7p]OT-#NQ^bM35tdY&%nX2fl[vNDUY_πU"WPSTB.np6:Sg<5Tr.<gxRD?a*<o&IJ9r1a?;Jk]DH<&B^SkSrKV7)w79BHpM(a]πU"a4l^vAeCCRX$W$09+u]P92O9$0IXTF2&Q9_.<XM<xQ%dup(%)9%%#%-%H$.%F%.πU"Uw3d#)%%5%1%%1%%%%k%nsnx%mjiS[gfx>h%<>[7k5wC4Nx0i/B/w)&0#77A,O6πU"?(S%BePgmInDy\b6l%qTSTd5wLb6O[:-9.zzIN;1miVlH_lRjIeT*^+VJB8kv7$πU"=?f[IIg,DDIWi%ccsLoYaI[F=+I^Xbf%,+%6'k^*I:a>&Y+'&&:=yHY3')qFZ/UπU"NSe+2VEh#w>lfD>A2M[nRodo.CFI,-%p9F^Fj[R)U:EB%$vx>x.L/d)Z5hmV&>YπU"9cUF$K.?qC:V]7ng-j7rnoa81pE/sk-/'aQM-/.VLfF;$LpnVV\v*1'imnyxZ+pπU"60Y#j6?ai+OB'>7IV:Z)Yd'G2\ac\'21Ua$U4Iu?9^kNVo&9wae('veRu1OJY)IπU"0>[;m/&B=5mdy6;nfK?tf,doUOE=&18ENBZf5z>%To&vSW:f$OGL1&1T/KTKOm=πU"^e4M;w/PFprAc6rC#xu=q_ma)9>FCrB'ii:R$fN9\AS;*71f-%xF_AmDYG-J/KKπU"jY4<IZ3P&Z2up,8l57=jmi#ggItt58%5plK'bkv0K>'KLgpA%r('1R[P_^0We#mπU"i7Avn)APX]qA.a<Xj7Khe%)'#Kv2G_K,166:qCXEs$+o72N6-KLlTqX#[A^ikpaπU"0j7=(cTJA1&0auMA(SGUOSLI[=JV%VfP4SPtA2X1C;aa%*Tj6D4<Cw.5QSJOIUdπU"T_Z+K2$8c>^fieu2B$HQb.-$l3,TU04r&q=p'L^uIQ#UQE(.ZN=[?Tu:kvoE*PgπU"*vrHZ;)\hyI(Es%E_OA3&2BY5RLvLT5r[jBSEN)VY>sK-7HUVkVL7-vg2qcEX<>πU"gYJxJYJ;xq<&&PJfGc'H2-lmdk)Ho'6#v7bb)0SAEt?fIS,5wn8QATYD6oWK5L)πU";8u%B(_o0Xqu%0Y?\QiNk[#z\Ps0akj]VZ3^2[[pVDFe90=7eK=AoDEGDi#I^mHπU"/?^IC=)87K1NIP9E_HG_:?LW3v-?;*<TZGG6oD*8^eLcs[NWs<V=0*sd5GfUiGUπU"kM4m1VZ\&t2'6?;4<_sQvk<nHTWBPTd.ON^m[aVB\.PG/m^34ep=l][D]BP+.,#πU"lCABl02N+#G.YTDO-)1\?6t_V2jWZ_NR1lw7)Oh\C=/n19M4&Nx\,aJ]P3t$UXLπU"O3XalH0R+MhUzMdDqx>&$>7UQ?7L/Ao\y%N,ZCtj;eDW>r-P*<Mp-YJ7A,RSY:RπU"'I<]xPB30sfZ<K2':h6>f,u(WCsk-sFOfWS:V5hV6t+0k[+B-spy3s<g^Q_[GLYπU"62%]#JIV3Zc\['PhtRi[mSvv37l^g198%$<]JS:l#4E>6*\uiK<*7k28o&(-^-bπU"_SnfLE#3488c#0[mS-je1;DE1DbSB?LqyNvtEdk4^Cu,EojGJ^8SfzDrk<k2[saπU"V*?'8%up%()9%%%%-%4x.%F/i&r+%](%%&Y1%%%0%%%%hnsj%rfVS[gfx6e%r>TπU"7]56#$iN=1CNInR'ADnO*e=5]UO1M$a'Tj3(l)?p&YNo5ubQwpRJjJ%T=pJRGKYπU"a$2>U^AkAa8iouAq)MKI'G>^9lB2ZkZpC2U+[%1=#UXVY?O8*(g1Nq5OBeLgvQTπU"GN1r)qZBhr$qXt+M$6NU^M'H)Y.Ek%;Pfg#JNHV-%I[vN/9ym3qbC:[7i#RKYfMπU"a\'GwCGU7P6AU,F$sAB[H9f.;)E2?Iz%'hJMPth'=LvXZB[?Fx1Hf#mU(wDngA4πU"-r2&eF87%<^tj\iX.pCmY/_aWDp.BAIj9B(WH#U?yfzQ9IO$(&2(Khez[efa.USπU"G[->:/2$s'IP44VT.BNEV+*TZ'[$w^C?TswSEpR08<l.B;*j-L/c;seMdZ'=&gIπU"QvNeY4'mGW0X(('s<5m$RXmwDLr6+XJRhtStA*D2jE+<iT1?9H(e7[']kdGisU+πU"W]A+>Y+O9+Nv0,>$AZ7%n+IK%N(r.(PY?0%.<9T1P-eX=S)]:LJyrwCD06?(7xNπU"S&Dtjf=hR*Z;aa%NL?ip;'Gvy5.^0R':nW$M/#rhN'*N,'FY$g,1)I.xI7rhe<#πU"c>E,AA5[\H..K*[-xw+XJOF_q-:YXF^[sc^FuW8EWwCM4b>38[7(1k4T'mm1W>TπU"i+KNN&'Ybv>[Ye-m#Gi7)uKL6HGQ^2EXR*SO^FFtMCC=/=:9Avm(W::KuYwJZ_:πU"m0?^:FJHUb3OYf>E.ZB5d>+:&E$J]OgYT^q',6i6.PlV&'NoP^cX=-1.)H%4:?\πU"6.-4=:iF7^5DP9H2/9/'#/Ap3:u2*[hpfUN*Q$tjEb':KQw_E3%/1NPGd'P8,50πU"B+P)PG$vJ*Du2$69[ud;:Lsk.ZrPvRUqRhx<ctx'w'r4+(^<-bx(v\b+kI;bo1?πU"KTdnHtUOjpKwm;=z?\Y9)Tyr7\cal/c1,Y=2&YHN%M=_zeYhu3T3^rF*a/Wg.lMπU"l1&jJja2=dTE[Hc]T_rFb;4Dk.a4Q<Zqb(5ul_RbTp;A4?k)jDUs6:hXyqb06_<πU"OHf>u+&kXs>N-hv+u%p()9%%%%-L%ch9jEwPp(./%%+%a(%%%-%%%%xpj&(SiljπU"nf$6(3OE1m+V'ed3r=oA$qALnAD==Qw97Ym$<aI,+a,ao$zC64CD%KI&G2q_WyhπU"+GO2e=WS$1kf$yxg[Spe(A<6Hj>)bW,7n%h8j$4e/XrIRs\^jTu<vQBE%Tup(%)πU"9%%[%-%eDeGEt)yRve#%%%j%&%%/%%%%g%wnhp%XSiljnF^*+29E5H=goIkeu(KπU"n5%O2+B+/wpm-X5Ao+<e>*p$'A=[yc8PoYjlKmhtoD++9Rp8KQBP>0NVtTNU&-uπU"p(%)9%%[%-%i)c)E?bW8?]#%%%Q%/%%/%%%%q%nqny%mSil=nfLr(3QU5qU0U3BπU"w[ko-$iQS:bS^t(s=G'4HLE/CB&?L8#&Bx5kMIdt.+%RcTVNd'0hv9o#aHJXLn$πU".*#>g=/*CXl=N.:6--?F:E\[=2<QbA>Vl)^Pt-59rOA7Nn/FxqKjt5J^J;o;EGXπU"8;SR#Nl8>P)hFLTVZGs>^I6jbM$RZT*9Y2Vot)+QuqvF3<4tlH>(Ka^UHHtGlE\πU"ulVqZi5hR\&fZNARY1ulm6YxhDt?)i*lI-#=6(d93fA7].7G-zQN$?:$&UhBY#NπU"js2MW:_Biy0CA.%bN%%up(%)9%%[%-%A_$[Db8A:dS#%%%*%%%%/%%%%h%zwxt%πU"wSil=nt4ODhPFSN:PPZm&&EEI99Oc2Xhh./_&qq&O1E23[R8X.I?seF&%&y%4/%πU"u%p()9%%%%-L%4b*FElt$*MU)%%%8G%%%.%%%%wtt%rVSimlnfR:b]d[75%Y*(gπU"w/EE:A;x;+skm)Jo%NUxx]4&C<Bf&V/53.^I6m;YqxwJ4CmmsQTuWri6=NuwlPXπU"q..8wHjtTNGM&GUfd,1vl5*MWn'X\frAi#i]_M6dl#\N[pZ1X$uS0ch([5vZ3oHπU".d=s%h=VZYj':7dZ[VUX5H%84.z1'2Ef;<2lK*[6[<0H8ujm%u_([dx8HBE-?rGπU"=M-T;\24%<?Ri'=7Z=]%J9+M:L'98Cvw#\^)7a17xpe#X<IQ^/c_pw%'GF)^YmFπU"9.[08;RoJ6C*K&465E-dJbkZwRZUbJ9#^L9?d'a04?CEYruT\*I[mMIUs0E<HaMπU"4;bYG5[j,UTA'/pI0<s\w47#m%LcZ[N<;(.G2N[IxJ9R6E,W22P*3OXUR4Y1jEXπU"JHOe<oC'U:(8Y4\='vUH3;Xh:RopEU-i?YJq(Sx20oNXQGCX#qHh.I5V-\P0MESπU"<KB[nKSU^gw_M(o/XA-pGZ'BBLvDw,lTcGJeTmbu-^u,=Ip*pHC?p.NhBc,)i/kπU"zm(m7n;396/Sc-\e*<]S'1B'%A89J#'3.kCvLWr=iLVN[&E$c&E8BzS+<54CfC=πU"*/e*S>B^)nW%]I_lGCW_+KVs?UohN6ZL)iEJToAZVT;rSjZr\3Y78$'X,B/cn7uπU"dR?a:,uh.HEeM'%v(.KIkCvZ=g+oW;6DofdJ7EdGL?w\<BL;B;(G;b.jGNFkYF5πU"7F.0<s-=F#Bt-7WH1jmW-^bQ]sflB>I]-18fF'&a[&fZCC(rIe$?]WF/j'a2'0EπU"QW8].jx(CZsLDSxvT'*uW0g#%/=Rw=g_l=r'I\58.4'ck<Y3We'o7XooxeluPI>πU"ER29NQ[)Y1Xyh%#f%:AZ4u]sA,CFC,fHMtOMcy;TbRRsRbG)Og-Q4Z</9Mxmn>uπU"B+Lf&V_3(eEB;5%R(D>fQ8TntqUlP6.'q>ZW_1xsSMBQMK&x5kUuTD_Z3?nvw(gπU"3V;X-4r9RJ[UP\sBJ+mM516$u8J/-'MvINMWn%G1d3U'T8uCS=q\GHbBWGgYrWQπU"U*pQ[3;Go1Rk'hzS#MEBneW*5#i%#<)KcXi+hJ()gBEj.otj+B-b;3,N;=bW01UπU"78<+Z#Q1RSzvV0Rhnd951'XU;VrR)fXzd6yra4&7qL%C<YS.S'P<=TPdMs[_m>6πU"lV/<JMp/zW#T#?M#SL0dcVirgo>h,#['86$8Y5fE\:oR0'U0AARvL;ZPw_2]+&cπU"i7*6gOJJTM1qiy=_hMuCVIr)L^mG5g&JV.jRBr1LsIE.h3#UI6g^eS_$ctbF;gGπU"0D$AS5Gp\11(4?,sIW\cO5%&O9)sgiR,L_x#qaKLIYp78ibOq#e=*Q<sxig**BXπU"lXwpDT6N5T-$j&jH#Lp%6npr)4Fo;D*SWl*+;<zD4aBHR7.;PH$[)q[DlS9-jI_πU"'RaNKP(X.pdcs.P]SAZn=1Pi'(WAZT8vW:TxON1NSGp^Xt8%up()%9%%%I-%:RnπU")Ei3+84T)%%%8G%%%0%%%%wt#trV.%VSilsnfRF)]R[5O%Yd9)#y)oWay$m+W)4πU"y5x#m]3s4G<LCPVyLy^N6NuVPs;v]-Q/38N>bJe]epdNvv?nndDu8xk$6PC1=mdπU"5d$t\nl?/i=>l0OYU\1l]'daCx8pMWLn:r(yx.gVZy*ZHts#V1L#'1y[Bn1yU*>πU"=OK_z/k7y)r?;;/5\Fz-HHRq+.LyZ%4EM^$788FqI.7r=KM-P\b24%CC(N&$)?/πU"A7.'(S64YYWE*M\k'RICEx4Ko\/G7eJtLsWgO#eU&\RP)a5FFGgW_wf3s0c9pl;πU"*7;=UKdFk;e5DV^FO7YF-VzyJQ\x^24p$5^mg0EK<zcmPZo'mojr<&C3m5kEIb#πU"NB(\.oeS5Cn^u*'3MU3ax^7/-Yq(S*9^RV?gdfX0jgqXHC+ST[0%U,l-a_U-m)BπU"^-JG5+u921%SXnuNC;<8Bbwq1(A78&iXp4sECZ;-VR563jXKd>6_B['*rm&a8nqπU"T_]*TNSCc>Ae5eWkph.l[aY7gT,LFqFg1ESNET-<8A)D'dwg^>C5\jhE)$H7$JuπU":NRl:>iBg3.O)wrEGjWlQ/EEW324p+Ou'-SHE0DE\GKJ>qB?OjeK,8A20t7SnRUπU"ZQ5#O.Z2^76$GX5D/-IQ98#a'>$.-Ipyww)5q$I2EbTRmxw-Ps.%8&Jri7cU8K1πU"^..aSQg]0y#j8iM;(/S5*512kjXP*-58PX-e1ed'?[$oZ(g;_31g#Wnu)'CWG0MπU"?d>j0J_>Ja>=nl=j'QfFK.E=^*]OGYpxlR5l=a3&w5'7=&^*\3^hA4S&whe1nY/πU"aiY';^-a*R8yJ=tG)-*1Om+O_:*SffIqQhqH6KvoVFRoiS&y.7J^.0EOw'raLBvπU"ywj*0fFW<\Xv21Q\jbwSea$F&P*]Z3IggMaTt=+G#gm&d&=cO^_C[/F0l*va7d?πU"&=O:bUT6YGBY:T]vyIq1W'yMFpeeul3t)%mP/\=[W=-uA+2hpZg,]XB^;&3Q-j%πU"]i(0&/Om1wLJ-ijklGh?9'h[(&K_;WlnL$4F0KggZ?CVt;;En_5&K)TD_^V^<]VπU"]JeNd9S,Gre2K50hGa)S8;H>k[B]scR?U67iG\?Qrx73amN9Rhb\xQcN-x',['8πU"OLxYW)j[5GUanWwO83:N8BVb%s<ZCw^KNHHVgy=5B7xcD>';7Sg<?mI:^w$u&qGπU"inDIR8mZj=LTEdvxS=kues%.K)g:AS]F(iUE0%mk]p'A/FT%K6Fg)%XPnLihW)aπU"l*^plvf=3W5i;(/GC=uSCY672%NnJpQqHo)p\]PA_=k(31bBTI.72Xa=,n5>bY;πU"r\13P4P\q$J3;:k7_0[C4DhSGu/8qQb)Gj]1aOu,=odH=f:I-x'%up()%9%%%I-πU"%tlJCE9g4p=u&%%%.5%%%/%%%%hn.sW.f%SilnZfND#&RU5+*Yd4c*]c(<9.%'&πU"3O4s(J]&#?14xW7TaF&3^Kz:[(NhzC8bAu4m(CqQb((Yoc#t#9cbrz639l3[REqπU"_q;t'ThOp1zz>4>,^jd&fqeGQ.=_QXT&Fca$*?^7oKNlzBNFM5MIaa44.5YQ)$4πU"_6$^=Cone3*9gVV,1S5CE;t)<P3d_e)#$rCUm9,DdyzHF2[/lgDr+Ce:i&NIw$-πU"aL3?3\QU9spdQ6RSo[/MEM(2+&[a=w7h^gu4\7ZQtGEphg6tQ:-cM'Q?VH\1JN(πU"Fk7ji\-lR];SNLp.Ivffg=TW/kj)W$H79_3)npf%M%3CMYa.Qg=#b316f0Y;nmMπU"KT7=*-+?)pdhc2K^[U3LkDZ#$[xHeCttd%7T[:0iH0ACFAO6bAu,J1.kz[5>KZEπU":L6=LDP&=Jr8D>6214R:X?6?74=OqdEcb+Lt%.1(*RrsZ0Jk)WWX0.wlW/ayLcPπU"vmLE1&(iKUrBw\YUhb*7]rX\KFrimaGOb$XDa7^BixM-_n3nLP^u%mUCH]^'l.uπU"p%()9%%%%-%1/f9Ed<,U0&)%%%'t(%%%/%%%%utyn%tsSimlnfJ0*/OUR1)IWnTπU"#4sm.l8??VJhDA,*#j?RU[GmCFL\X-]UEN,2-vH>w=OD)zIL4nKx+<X_i6RM5&hπU"IjNrf_KuBo)_;qM+'WYTC2hCYgfdNc,NxuS%up()%9%%%d-%_.A%Fdl)1cG+7%%πU"d=%%%-%%%%rf%uVSgRfx&';<>Sm+5wCNWx0=tq9_aBrdF$M[4+#)A91W=4hgj0oπU"7)>:q$p6_ZXXgIcPq:46JjPBME5n6\5a$4cQ+L'ubT)w#_+P#hb<GS7L,1B)-.:πU"zS=7g5t8qs-0XC:odP>vtrfB<ugGK<+OsK,cn5]76nO#d:7X<G)DIKcQEnE-.$oπU"*UL(YK(Xq]hHPP&P&br^1*mS/b#34;%bD8VB3>;4QA*&X0W<I9Sw+QI1oB-:Y'7πU"8AN#k[^]GaE:^hSV=yg'RvA7Lq/E=w1ZYEZ_zH9?$Q76wY)%+#7sksjh65NY\t&πU";%=Nw+\$qv^<>ab\TipjZ8?6aP.Up',g)Lw7q;mq\.A0POWi=pLu7Xo8i6=2(7EπU"hq($tzd5ijJ;-tEZe15$5Na5CiV8e5&B#t\m%;h5rid/P5sasOIAvLO9Pr+;S^tπU"R%nD:iISm+_W2oMe213c6GWRE4_Rk2nF*GNqaPAM+gv1rE-?sO\Ts>>'64TqR'BπU";>jI[o;c8:n34$\G:7%kNnJ#s=['ptKToI%nF/9Rx#0?9um\UN%D(ii4CxBUG-eπU"#EHY;:PL/(t(b\nCD^JgCE\G]Jq2:yLjGK=4vHb<K/wc\u3c5+humS#=xEOGjhKπU"j-u$^E[<syMuZsftSB-4?#NO>w_].7G3JHDoLqV_UHaBP+#$t1dU*96=1ugYWoLπU"QqqLJ6BgPOX:^wrQe'(+E(&+qHR$A6-dG[0UG0)dm=M3.:22)&aUA&&m>tTq)7QπU"[2;O62E%e);7MF%kRon(^LevIS3n1<^$wtv.GWN7%rdh3[2P9?<V_=-Gk(.xrJXπU"ylJeY1pJgzs9U2(3oKM>$yA_N$F/7^Q$NdhoZ8gzbi4Lwm&s^[JP^Jhj9rK,wm*πU"Ms%L,=sE9+:.z=$5'r3\p4%wkGj\r;S's:C*&tdMVgYQ%TCrbsZ,mg/ri&*3b;HπU"G>Rr/,?&o;OV&:5hWpX,s)rs#S9S65Ae?;:;_*)&E/(il#aJ?(s&I1%%.+(1JELπU"H9XRns)qP'S3WH-HW)y:nMkDej+&Hlt'#XeOX46Yce9,DgUt7s%:Uo91X2ZaV)qπU"XYk<=+a,'bALQ;F<efem<Z<gf?p&3*utY,v>cm%,(a2]VUN#>vv[0MXL/#DQ^<BπU"v63iS?EJ9pI69n_b?Hr<D?7Tbd-P?e\<j=5#nUXm)5>^2VG9%dn?BCtleTYWA\CπU"Ju2^dB/uMlsQ<Jr+=:WbsXQA$3Q8_pNRKHvSr6AW;=2K$:9lewpiEZ-uWj#Z-orπU"VJR<K[(k%Tsk+6Cod^P;I/#B?xi75mw&\VIMDs.&wF1-Cp5BJ-qA7WYclr)(sr4πU"cQcAk$aHC%B6O-do,RK/R&d=]=W'fAu<=AeLLRCC=[/OfWfop#Eu.P,q)5u%>&.πU"BA(_#CF,:^sm/)cAlLRol,00I/SXB^C+[a1h)8xLIDy,A9I43T?0aoBj(FxP3/xπU"Z]GnZMBmr;7]*VC<J(WOaD;DAV\A2^sYmYs'-T+QDBAAA43PjC/q?<<dD=%olAoπU",n[uW43.4LCN),VWO6(%<[w]oedSB]BsCAH^AdWPg_AtnNCde#s-F2Kg_i]Otv$πU")$Yp-MdlWJCm[cblG*/$E[SF[6rjddLs3,w4<UjxrHd=B,#)7<_i;u%AuiR(#7IπU"=usIRhU8VMV,AW,EE9Q2A8;jh1k66Po+2^A.q?Hd-x_u8JMV2R?%k_bwGu)4o'1πU"\GzDP$+ewZ-XgdSYpfH.'t0Yo.UJD>2U&z-E;^Zc/kv;^WO;Kam?&&UH;ZNl0ZPπU"B[:X7oP5QMl](Ue86;GaxA6R/wYt4#*4tq0<Hiou\L#f;RJvmWAW:3Q,i;417b>πU"Zm$g##d=6zjzYn&:o&i7,^qSCQj0HsbFjm8TFH8Z4lw<C*^,aoXLHxX-AxNZqo4πU"hV(//La:vU[KZ&d,F/3:[<pa(#Zhu\'uDL+&8:pvC],6,0MUZn/Gc/gxRB16TJEπU"8'eI0;849t=K37T_2:w&JxYR<nrx%%up()%9%%%[-%I0/%Ft+:byn'%%%/-%%%1πU"%%%%ht(u(wn%yjSg.fxdy;<>[]+5wCNNx0S_n)ICZoi7acLc?_t7meQIZTT6>7KπU"V:p\XvASQkhFkQ/=0F)jmJuRaXHZW#bq2iH#eIN7TN6,bY3+t<qL3*k(Kf/UN2.πU"J3gdM((z,>,JGq(sc7'oLG1u0F?-3NZ<qGzh.*3QW1TnHFtefr\[>nB]\)kw/G[πU"Rl3s?3whh_(C,bQYgL2ywqS1de.RubKcHLn(bORL/)VlT1\]/L2L/WZZ[Z_0SMhπU"OH-MR4-_Nh7GdXX:nf-.hBIaZpjHlK4C_-d8m40;%G;10+RRZ12Fx].K6;ieyGuπU"j(>8MoeCF?X'4aj9G#sE1q'Z$8bG+6(G&RwFU\F#rT9&K>O'6TdC\*+GU#u*C'7πU"*e0R>pB_/m+pr*)V_iTH1Sdt3/&dk:k$G-NJ7$Lbp)'hQ+Y]n\FV+4TkU-7T1T(πU"=bl?z]1$(0eDb+9R[j5rGdxMThZA-=0&0*j*1;o$Qq2md]\*E'9$HpWM<,w-ZS-πU"fh/cY5ER7u\qF$+O8Q-RI#H[(k2MvM<D1?no[d,,uqG*;)Zk,q[x)Bgf%eF%%fqπU"b%&rEhlRCcJ;TM5E8#SEad/932v/pebBk=1VNJ3X4m=bd]d8=To'QPRp6Z#.\U6πU"VUpquXV6*))s/E^DNJ96$VM(]$hta2,C5um2N36OoR2[[X\u1n7Ar[c0.$h#ql*πU"0$sJSj+L?=O#1#8>uxLeTW,(;Hghi[W4Ba.oG[7#CK1mzJKx0XzW1,ys^Qi4'HgπU"'M#R;&],\UPpb=a7W?:ZfVv'IUQRx]$Z%aBIBTNI$XFfS%z[-NNtg^eQL(rx\RYπU"\i3^n$dF#<b8d6=Z<=N^j[>Rd)&.0CugeYrUjomEK5/2eU(1#03]K-SK'Adc_4jπU"Dp]$cHUJ].cSv,q/q_d*wDam2zljg<VMW$suFTDQXmrArEXvoGAQr7qjUxVU4k>πU"VXSxCH$_h?8tXd0M+po8u%p()9%%%%-U%O.%^Ff7R():5%4%]4%%%1%%%%lfr%jπU"rjs%zSgfjxf,d,BT[7ixmhu#4]Jh<A4emkKQ]Tid\1Ji/ue%bb]a'/BD'.0/]tmπU"mBn>j-vnl%%).5Erq_VG'UYDiYiuf1)P,QCT4iG>6?\j.Dg.25]o5i:WG.n.'8HπU"\_T6Va\pn>%]M5]=]Ebb8I/Bo>c3IjMTl4DGpjX_L=sbWr)?xs^0_-kFm,k#\N=πU"3Z059')M?(_-'?=$X#xGA6g&iuRnU]8om\N]5DfQuQ.add,fBiV/eubGX5jg)M^πU"(Cd,L>N?f>Y7*QPU,Yt./-XamEcPt+<]XF7gjci%Ialpj3PX,PXKMX6XpS]$WotπU"#a#HBv[WcUQ2uH]oXC6/q55)=Q5ZQdSTmY'D*B]hSvlfZ#lWX=m?sC\eei5?gb'πU"_CAVAB>I<$&/9hqPP'IIOZKzhJ-jy:fq2IBuTN+8ji&T'_IIZK\zNYKPR\H*860πU"<)P#b;/g'gnH_;J's-?D<hEt1Y(tO:Z8b-7=rcav=s64,fTd%&R8nRcw\;5Mt6nπU"k4JvNn71Rt=X)WhPbR<H'J$La,sbloYBa6%(DTUl]_K)<)Pw39aKs#GOb1d9LfUπU"$+1;qm%t^iD6UG<;&1.5B?Qx5Bpr(I*R%W9KUV'E(*IX%Wi:?E<%V_:U%;=4SalπU"$Qa&R%_+B08fwSMt9lX%tD7E:P7x%13X2J09P&aE1(j^?Q2m8FEQG&BsUAib8$mπU"4VQP,1\)R]+%4-C)P.fD^AQ8i/>oY9n?#:P6Yh/YGhWS-GFt,SQ>aQLlRbF9Q[CπU"mO<Dj>25g(R,;3cJGamWpjnI.Ww?HGVo^N[G>:aE[m#/Zpga4<eG]TO7Y0'PTCLπU"<p'1f]msi[8'LhO%1?b8Vbs<oTrI8(?,JL,j:M3LgW)0(<4A)^P0R>\Rs):>R\?πU"l[llBsgc$gqm/IhC(.lZzZ_rN/UYpH])MBG*e\SpJ.>?JWLqwWBk'UOUPJ5K$4ZπU"q(rYN:2frUFi?CRChh?laum1bHT0/pel*-CU-*[?Qu_RoMI3/PWNgtPA>XLk_8xπU"gWf/tdV1P8QTue+8Q$)fOI-bzY,;[##0f40Vf]8SfW6/wL6fOgOF6.ns4_od,=_πU"<=B#eFK.\tSd3XT[d*A/b;E?ikYouY1ga7m&q.^6>UU>AHMF'#1RWl/ljL86,gDπU"elcg=)*f,u4t.3a2#xY%kE3']Y*4Y[S-f5VE1KcAs2d.5\'<UPiu1NW>dakYPHoπU"3mMZj-$c6jdFj&ULtbAXh7V:Ai-=fbj9<Osb.quk+O_DS6jL^R$jZapfWVtFXkPπU"BrLjG]90b#u'aT1-3E.b\-<[uLjMHi:.Z*^('-M=Q1H:'vr[2C2'e\$?4juq,aGπU"7Khi(.U3O+<s69C9S<B0dBFu:#(1^c/Tuh63YjHAFgxc-tB1j^U#SeqFLBbGg4CπU"1C1m0z):o'x%03A^(S?-3'8QD95W\vPRW(olt8bUtY\gr<,6PVCsM]..0Lbq.\TπU")sd^5muks8bnV.AaafoDZj>gF_4-q0o%Z#kopI6mXU*8jQABOM_\Fo$X6RrJEciπU"+kQGz]G.$l_B+QXJ7alw6YC9KX0[MBbE%Z7L$?A<3]wb'\SIJ]&QL_,Slb.6-\:πU"5hxZb$E$V_Ar#7x[_vP>/Er-MtRBmD)7pg-MRA+2'_a$jxmeNs/X4[_oCZCne(MπU"_V^lM.6OzL&xE$+uGe>fe;gU7A;'FGC,AdC>r&$a5Al[w00ZVCY+?9\*ZU]QME]πU"vEBv$DqXG+SAAr%py'djw%$3n4iQCbLF2MO&q6h4R(*-So#udO#k,z#2+<MHYk#πU"3G?(SknZ$I)se=Fw1HP0\:n9K&=m3BLes)k9DGN2V\SVG3sU,eDWU,8?ahV3(>=πU"^DSdS2Pt014$A'>&D'hW%J5P%eV[dN_LzubK_,YlPJ(5;-W7/AwSawWwcaHf)/QπU"cgd+)ZOz;NSqIpdV=sGHuaUKIPPjjGu2a[iv.U;a?#$RAJq2R6dnkQQnFjC7Yx$πEND SUBπSUB V7πU"H[;20F.3TxTgT7J<8]D-#I72,S68qz.7/,<sNG<#pMECSEM_u+?e;#W#:m?Dj5?πU"?\qe8:qUuzORb(kGr#^I;%P,bko25ldJ6Ac_8%mOb/[(D17.hv87A#S(>7J*d7RπU"v;dl38QpAUT8E(<igMyAU[JqEEEccDQ^Jq[9O^1.i2A.1Y(b<3cg2J.kQ%V8VpsπU"y3*U[A(7p0Z?E:v8[n,4UpMx\$c.4RYqtEnJtB\xCoJ7_loQ.^Yl7=q'F'hv]4SπU"frw9-J*6Uf=?sky^%3<MqQqCt_MvgME]?-f#E$'k*E$(JxZLfA[mre#SnM*Mn8YπU"&5zcLP7EyK4sIgz3rko&CPEsocD$)5nawWe&k%dN-nG1&BohJ?M,Svb7'^W53jCπU"%E+L)i'cedoYAvGanUjcM':wVJ7,e;Jz4EL]7T5N[x%,SH^R6naoA,gF8Gu*#UCπU"f8>aaG_p1&\:wB4pSEBTqSu-A9BW:mO[fcgSHkuCm<t;e(J+O.o^Pi-JK_P2Z_%πU"^tv9O:39d]9jTO9r7v7APi3U;*5&XZ[83ygh[#WOpAo2>dZtHS[k'h8A*66vXO.πU"\KLGSxSD8Ts1.a(?8C<JeA$*nR$\1SD:^&i]f>4[l6^1]FPwJQ8POWmr04l;dqmπU"Z81wL+NWY*TuZ5VWwy%#'iIO,'D$6v>g)XyW3z-'f<5qvA?d%0LgXEUc/4==_7NπU"r6ez)x>dA&O[k>9\x%&%#uaueOJ5N8Ql9iCq]4SBaG,UcRJGYaaEk?MOTF7YgBfπU">N+B7CCT#mOpI2p7Y7f[NoU1I7/I>h+O.*BJj$IgFu)XG_K53CiEN2^9;/g?KVCπU"eJ<mzsXErW3mrhcSs,-ZWAFl,w0E[U)'R[gtK>%?UhDZ'Mn7G%G]wG<;<_YVX,9πU"C*0#_]P0S;t1s;RaANgC0z\quGu%q]i[JK*_5YZ#7cW)8imxhBvkVOI#Eu7[j22πU"4[o8MlP;asLYs;H9G*t[sp3A$LdAkm$\C:G3A#U/,6_]xPT,Ak/t=\MiFbUxdl0πU"JE5tlc=RVn'yN/1aK:z<?IU^zS]jnk%.sFL]'*xJpk%H#v+2msT56sY25uuGs?kπU"B#^2LImqhIxKI:mKkG=t7F=EVhg&hA'^8z7Z8cGrke&i:6HdzU]X5TaO5iW./:=πU"G<(xUtWIiOnD=K2EuA'X?K1T_OaMcKrDkpnS33guKcCJMNQj(PfMF&Gt9iL3PQ%πU"LANu>6'EY'[JL#c0UZ1Q6Yqhx5rD;zsMY=hqq%pT=RVL71<E+V3RF'/-V8g;17RπU"je3SO69-HMJqctXgNhLk;usEW/jF4gEltz4?P<.nLnpn/Iyz7#/Yz'fZjc_agzGπU"DdqADdt;w*XhNVI:DudfN&r0%0W5-VIhMDBRoawVk2o3223V\LM<Nep=rl.3\oKπU"c[)zWT7(=qrp32_x[wV>523rZ23FLWM<gpt=,.3?Foc[V*zT;W(=,pH32.xjwV%πU"2o3R23W&LM<Nfp=zu.3&oQc/)zWT9(=Vzp3h;4Tkx1)j^Rm:w.LKfzc^0C?TG%&πU":Reek5Q^.S1pDMJ^3eE4TPi(hyme;L?\Z)YX)FDfT49:KoKA=x/;(]3fqE01fckπU"e:9tJd?j8-[+v?&h8cUBDnx>tBJ?k8*-Uv?pR\K-=mhv?QeWMR026pTE7cpuja+πU"v)(:9Nq2&fhd_\_Y-uxUoP7sG4(ICUn9<tv.9u%86v]$fC's(MDtWMi^L>9FkcNπU".UHnBK)Z4*WvYl9&YhxV:ipxsZGtMO?$L9cFkc.N?Hn)cL5t&58WvYd.vdp#NRfπU"dTpN.sba5t?Vl%$LcCl;D9lc.kMHn)b95t&nEWvY(9)IhxJis,mTpNFtXSDtcl$πU"Fe]8LWR*H.kcteEzipnxZBtTM?^L4Osw99VMhxt)D+5(t8lM?DtM?i^Luf]pl1ZπU"BE,4DE#?KRf*UULgASL#WiW%;*w[VaptrY?NiiHi,),arN&0mu'OYtxM:evxXZHπU"L32+Klapr5U(2dvxZQHL3u9]ZlY%>4yXItx:kYvBE.6c_8W1(1laUrxfd$$8oZ<πU"+%C.gIY%_/8oZu3_89Y?hhrBUDbN,H<j:4Dxjr__e=9<G(qx'gC/?[KZ4fdav1PπU"gqK^]6YME76c7Er8<F<mFOTHi[r2(JhR0Jlqm<p?X#?PHTQm,6e$f#:T&WZ-VK%πU"]SF$I^EDiksY^Bcs>QOAUr^KOD(e&vzQ,YfC,)KA/mV.yUkNgtD0?;BYb<:V[bxπU"q[-=]UpJo:_1KOC;m$bg65/GU3G.,joRz?>;rUMzR><1xVsze#HqMR4hvbD]WC-πU"#D>3*Png_A4(T\_+s$PXB2?3X*BM(AiaEIb6u^n&;3q86eqX3#*.&xFsmepxFe$πU"h*=3iI.AFhXO97iof&>aS:X7d-gK'R?^1Vn2SmP1GBICd#]s^l-Ej2,\=XuHojrπU"NP4r$RE4mO<2u&e[IHnip[L$i)LI8UkVr_8%FLF-7mcL)1\/r.]1>RWs(an/brFπU"]s<UJkEZIQfI-%CbVE1Pygd>vA'TnU9raR:bF^ai7c26*\Xge3RiRD<tEw+hVk5πU"CX;P1uGUoU*h=M<#qzap?T8uPm\+L9En2UBZvt_AA+r6,m0^q8R/KB6&gOqw0EdπU"LC5b]ayZS.0-2x>8FLtq>uapar3/SSC.Md[JF=.6/n5y=GCYb]ld#:KN5.Xd^n_πU"AXYf6STwY(n8Ft)<ak8AbY)bsyB107n?.rmwJ?lVgsB4'8Pqw3E\NCPb]aLZS.0πU"(;8aKgbmSIF.KK8/LKxa#D>bY:Djso[]$Vnw/*/Tn2Y.)a/^nA.snfSTAyYn91-πU"e/-lK[nSb'&_?Mya3>Pb-9j/so[LRUnRPko1E;M9'AYq3IatFf3xN2<.s2bk.T/πU"P&/1&:xKOI(s4_H8vqKhFKb>b*mWng4U?NtV#o^[%Apo-9?N:][J=trSgDWJm$xπU"e4lRPB4%MZnwPk:d+;5zPuG5\4_Dhs#M*mEuS>C8Py6c-itLLD5=fC4qI^fq3q,πU"U%4]fw/Si3W#z410^Q2(idfIE\8Fm,*nRz$_W$eVMD_;;S-9\a?XG.3TrqPgzmPπU"32Z/cy[<eQ\L6eyqS$m\OV_kF,2WI&Za7LQ=9^-FgKEO<hmQMCQkonCna+quPoYπU"3%Vc1K]/HA6C0^&$I4lfX)M3tKGkP^4,IfIFvhTotiX90+P<cKPg3*:K_]i0.FnπU"j41qqbOU9CPe<lk*Gm'R-e?7,>_w#6;v;d.?t*>5GV16H:C;/sg9lxxLHQz8U6oπU"Wi&<D.6T0Q#K3Rd0&0'dY$Gjo<mD.4qOHX<;R^'fa8<CO9b'0JS+F)'d,eB1z\+πU"&W\tc6Ds/k)X-mcX[X<-PIpdr:u?p?k>x%%up()%9%%%#-%(zA;E,V8=#I&7%%DπU"7%%%0%%%%qz%hnkj%wSilanfzT)<SU5<-ctA$bsY9#TAz;(RxEBT_H^snTm*6ldπU"nQ:b_<Mrn/t+pUVmjbQtwIBugln\MtFf,SE>G2Jzv2;=NeR7dBut?oQwQ,;XAiOπU"EE++)J8P.,he#rG<+PicH?1VQ2B<;<1B3*[G=:8J$6\f\F,np,dbEFINm=PnPbfπU"4>dz<93ohsL'C=Va/Crf<\b#Khh=AdcJgA\6(<A;U9#[X/8./R#e\kwtLIs0[n6πU"4c4LSroVFe>9)[SOI\JOn#ScD2-/c<YaE^]j7(6tf3VFS*<S]=(n4Sf#11%tb;VπU"T]&p)*PIpSFOD>[Z#dCvm=TnWMl-=Ps%iAXIN;I]X7wO%(0[7VI]1=-<\Qj1+W3πU"<fC_I%0fIUumY<L8i-4oWUSU+>Y]t,nvv_^<q9.^(QNLtauy3mZ>BIxV7=3G23,πU"#(mM/+[GWz>CFdT'7#&Y3r=WL_*d,S/#8u*oVl)&+4^7'.$+%N+4acNudpYjZ);πU"dJ%w93Q^\XO<c[3O3g,3$O:A=D/NNAM4haJ3nihZdPk%I%PXC_egrp<bLZ;t'DCπU"cVxSe:4kho9^;.1>8*/Vnv4#^cNJeaStto%(up(%)9%%#%-%0_xCE5DIfxo%&%%πU".%5%%/%%%%h#nsW.%gSil=nfNr,]\E5++IG0:pmNQHQM:?'g%ck3XO4#c,ABsgiπU"LSUb0'WK.9d]n%,1mBonQkB:G$nM^:4Prct$(Ylmtl6l:0Tt<m'G6eJY>I\kdrlπU"[YB?dU_w?%;Gq*j>2,7zZ?q^_BXOl\3A'tW/UB#NojP>REd]4YXp&nd3)*wa,#&πU"v<N-cm.0vgec1>r:SP8#2'BEqN/5t8Az?KC^fu$2EcAOp?OUJI%9NF=I3LHw(4WπU"mU:^QFZ#CMb%ywQ:ds>t?5MAVuh4qtE5Qok%t'th#Z8hCI[$C\aPS>RY.NuW:0KπU"_K7JC*HE,5_0BISyB?5[Ubw.3L]FX9We?N\Hh9[t1Srq$a8u[F?J1\LO50<0(RBπU"VXCNEIv<5=O42r#(hrq^:LN*08PBorx.na?cf(*&<N2-g$:2sGrs8Dt>)\VDJctπU"shTw^\=aHbhu6bcMUhs^9+tP$g>UwVLNVi-;e0H'nDsrm/:Bv?iw&LBOIJfIqELπU"bKbL.#mZKNBPIcb3X-S$yp8Y#qPXtE(&t-rZu%(up(%)9%%#%-%R_u(F8m4v=8#πU",%%<%6%%/%%%%w%jfir#jSy'Oy&',>BU/:bLHqw6<nbIiH9*RMXjwho/wnZ,l*QπU"jXw[/>/'7+G%0'1%t96rnc2$']l'eES$bgHFnA*[YrWBHvtoald#,_cu9pcbm$WπU"l76TLPf99k26XMxt&'ZwDP.bLv:jNH6ZC&p$tdKd5\F8CWxH3J0DijLXNxAUSy'πU"TLjIytZ+xkT1x?aPydo2ga4W7jZOi8;,(V>30iJ\c(MDquBjS4hL:wjeEB.I_2:πU"Gj=4n:TQNK=x0Tw2g%qiOJ6VnXd[n6z7NdCw[H+-wlSmXU2hzX9Q]5v1JL=61z&πU":wpd6iw7cOw$,98Hr&a4Rr^0)9DYnCJMQH4/S9:UZh=?SRpe$$lj^J_VEp-fn(xπU"1fwPLIZOGq%]wwN09,[BoA1hO.Z,Ti4V<+F?/LUln]_nXU82=Yv;v6i4ET&fDWYπU"XOKXE.q4Bu:8kL=e[zd'QzRL0&8Ugp/9]SSFHk$$2(ZgV]%\^(J6B$+:$0IGRDtπU"4+7,uM<9F_$qgL9qxy[1\P(=8A?n,v2bK0[W0GWRC0#S7\U,+lI11E,\2P269n/πU"GO?0VY^pV;T_&LOBiUf[BV(RSKs(EK9b7ZOEjjp\D'4Rlo',%r6K(FuUy*BG,b:πU"x>N;&c&wY[eG&\pM2/S9o1P=kZF$32p9h%8uQiC4d%)A<43qFGWvzzJzZXtb[(.πU"+0ZM;]qw[v9.k-kxn_jKjPcwx2A0),wUtBastg=Jf\*xjQJ5E4MTW$44*1b\y5HπU"dVekfP65H;42G=w-]L.HXo(&rQ?6cT?4/UK:OiLDwK.h'3JZc*Ag,Wt\OeVio>zπU"qai;H2Qo&35(h27[xkf]%hJxsZ_XK\S-jBP*CFbw>)P+B_A0H,iOS4qJS-3-aIvπU"]9)9tH*$,9xBAo*wY1^YuXS%*eaKf-q76$UFpRB_^SbR$N-4<2X05UT2(7-v<28πU"#rPXBS^SW8%p?nMQ4(eaG[7M1Yuc=GD1A%:9ChhQ[qi)XPwIx\iDnaL_wn()F_kπU"*n<Kh,hE.M:D:&M.rwjSw_N-Tp-YGCD+TXdSt=XLVuvfnvuRFF^cv<Nq(z=$KUeπU"%pvn+H09V5U<B.#-M7+_ctX%II;=D4U(QtEi=XtLs%[:Br[>t&YGHIC;NvT<D^bπU"X(r\/qyDrkulr>f<<[gS4C?W%eiy[37h*G>_O/tO)dWT3d_gH-EucfPlLIXa>F\πU"<?DuGL8gZDetN4:o^5iF?V;<<oO<t[[IV3Tu,dV0Maq$h6oo6jWvKPuKx<AM:PRπU"t*^)H]?Ith5yFJZ$EeA[\eL%#bfDlJQsuKUOxD?Xd2?VdY]d--VG5\KiI,y79<$πU"8*j,S&9BmR_+lxktOv56y0/16rgqt$1Cz3-v/BL6$*wr>x:Zdl5+cRS:5OVR#(pπU"\vK+h:3^_vWo]4IBMWUdqTmS<Y88uC6+MZ%je+:Ft?ZXO_<4o?Nr=u$MIG2A*w3πU"YIM['='JI=O3fQYfEM<5H-.Md#2lnp4q4?9.]y>z;t;gPO[piL#-k_cr+%G1r7LπU"qbBuEh,9XcWCc=r=hlRmh#j2b#mks<7gba\isPrcIzsji45)exn$akay6I<*/]BπU"<lCEDc</kRiwhqMh6];rv:/wFK#xf.+DJi2J?UR5YCayaB1*0C,5$e'/2>jHSRUπU"a=b1vktj0LdchW9B5dj]2C2iBdgNsgA/GvIAdokP4KLShpAjslf8(N\/kJHu(THπU"=QB-59nF%8jcL][#K[<CKEa,Cc<[-sIYJOPJmc'TCnYd^1'U6&9RH&)3P5nBV-,πU"KbM3BcKv](T;r8KgWMWrrI>rIkF73^3,HUy.>82w:F\uqclQsds.:TLD5v$[ePUπU"C:Du1y'k9=oC/H,qS8>Ckqom47:<9m$l,Xt]8F<1NpI[cse:1U[$F$=qptAGD)$πU"Q'x&kD9<W6JrW6R$KX6Y&X)zD6D.FTerL;cb:4'D-)n0P3Y(<<Fa3F/ioa*;P*lπU"FA7kzzn2/C;Ng1*z9iW:lakY5(P%dAK#(ht^c]]dZ)36_JOHgZAnn:Xj;.oaagFπU"ELi(tgFX<n9Sy*5lmSi<hsD;sohiCfG$qWv/v?&KQw#)e8t6^#2RbaLo#lIzSUWπU"1:IlDlKap/KvA>AjSFWBV/vwKSc$A2OCu$fRjA9\ht03_)G0?;P6Kx4(KVSU/IoπU"&CnI0(]l.fO:CAU$UZdQ]\AbCw-sEWgdqlM>muie^ZpymsIWCZ:v&>6UduJ:NBaπU"f'L>H,uWaR0E3P&[0x6t41.WUGz'sDUo)'*Fp$i<1AX^ggD>Q1Y&#]ed#cV1dzsπU"vRWnU[XzIS4/NSUU;)GF;Pm_f6-w6_F^_5?RDWpD6pWVJqKc:%_4g&%;$4J4XQ*πU"mINg8mv<0u+o$Y[2E&gdb/#bsK]qb1\\Q+=JYp466[:*xT\IVyU9mb\hFa0mbVEπU"(U6q1(9AqBOIDc=pyw^xR2rSN<]gK5+U3Z5ZN6A030+%jLJQ.3:JHw;#[ZhM>DIπU"g<98:+op\Ijel&kN46ix\0PxsV9H&aktFix?yrO>[S7U>8(%up()%9%%%[-%g'AπU"(Fv03l<_87%%So%%%-%%%%mj%quSg7fxNa):B#\kaX,^?xI^obdf2FfKH]\3]=zπU"9YX+1$ai&it=[dk,;?uBf%Y(q%n[M_POD3PHpvc]]jQ&^^As]Ao6JaF\^?IcFnsπU"*xH\4->_OJE4]UhO*rq.t3KVfg;;C*tf:qt)9Zm[-#\DlC^Q.r1q'pbNs]+^v_BπU"^t^l<,npS'Dwvtm%c^=Be]tv)upcXw-tq)S>]oGl:,?[FnY*7Q<RMv7luqZb?rqπU"mBou2W5tT_lu+%$wF,s;.5E?W:+7.H>QK;ckk9<9(Bfu\;<&C'C=QUnHM\]G2IDπU"sA_O$m_%G(lJRss)k^LLLvrNLr8dZuvlJaj9/FYTlcHFT0Ep7P*IB?)S-IxkpLOπU"p6jqC)aT/+)Zls^zs<Xh7E^>(GrTJ.NQ7T)NirulqXKGUn7AtGbVeMQ3DN>_Q]fπU"\d;]R^68uWQoDuo^s4tloVGKG%EFTd&H]Flhkv#,U^S?\jm-;Em.()FJ(4?)Ii&πU"h\d):Wo?d(k\MFfb[hb?]X\XoGD2WAe$^G*ox7/X-7vC35S2S(VRq)l,TW5:<STπU"SV4Ef?]8S8ZA-u4oWl6-f+V(GtD:(10L+S4IS'pm0a%dXw^Ae<;aXc:OsOIwKugπU"RP6Bkn9nsC)LamFqGm/;CmTE(bA3g6Js#.b)q#8uAtv6,ZJ\TW?v8[tMv_^:r?;πU"=E6Sp+8$[,/t2Ct1d=B^oSveLJaUbBxi1NCwWFZ&fri<qo2U3ReZooQHSG*T0?9πU"q)d/5,ulYrLw>i407Dp;Ic)/uXG_fbcLD];B[08$:mG<)2lcYMQ36sDXW3>^&h[πU"ie36d4d0f\Z4pl3kFL5wrdz\Clov+RW1b8NqdKR1,jxEcn>\ZlTq9SHg8.\wpZmπU";:SSCAzC)*i%)IAkkPBx7>8K/H]95=G)3rOvtO3ouJNi[fKS>6Wf7(]Ip:ZO,*/πU"Ld*Acqhl3B9&-du;Ax$/CYqh$8]ra4>(t#jgvHOU(J#6?VvVbT34oN#Uta)0-_TπU"lH#1e^qjm<*_Ch,nIVJfH?N3Et(9MNd2')gpe2BcwDt%2'AIQV#ok/ZufeBKmAJπU"iMBW*qq;mF/um48%C*Uph$_23)*)$&_;.?kSxGJ[mkVOWa1Z=GBu9;^c#x+?Ip*πU"'O>y0_f(Kc47>tGCD1($5NLdvE]*]_dwE5wb&8uS(*j-pt0[5k$1G)CEc^dA4'YπU"[M#HAy'Fm-9&0[:i:=IS<Zi<J8t]>c2Q-bJ-SVubl.>V<Zhc(>t8:7n=J.gzQysπU"EuWlF9e7T:00qwGSaat8',=g[mZ1Ld1;'E6I%PZ&)9I-+AK0/sFm5H5l9a&\'9KπU"B57e+#-)3el7tCuYUhR5C:(%9GiLe_3lA;z=4($TYLn*KpR5x8S6x:?gCVO-IYuπU"LNBT4kMZ[Orv^CP_92:Rd#z:j/Lq*1WN6/U&uF<Wr>4JS6(bqwCI5]2vuS\HIZEπU"qTP2J=j=GHI:Nh1dGx%Jg*:x:.&91Zf<+;<m&#-C(_,gK4O^W'Ms;MSt)TVMCt)πU"=0+^<oj.vgtwpYBfjNj*o(R;BaYEI*/bQ/TqxJT[Yo2FE6P+*s/rb/'[ks4&9\%πU"x:w.nV[e%I9S*f(6MV\Va[HP=Mu-3WQt-(i6^TOFN]zArByBL(Ah+YR(]#T&.LtπU",Wwv9J6W2U>[gG1GsP+.&UW41Q:qs)9$C0?bfDKU_ZFu7d6_FUInc<t6FgdMmXLπU"u\2b.9j'R:c1EeaJG0/FWIQ=h9;G/YKps?-+K_HOW^h<sh7kFpM/]&sOpYt_\UNπU"lrtd=/4t'=TItu=;ulLj)>GOj]'<)oSv39_bY>FOC.^%^_OmO]GI2ceJa1agIw$πU"A3=&T.Rn9M-Xs.l2jdgE['iA,bA/Zd?%/djMo:O2.FZA-h^YvSZ^)?):RaS#_2=πU"A97MURS(SB:*$Lfw&YC(_asbPn,$Zhg)a>et[f<7t%\^;Z2P:ky=r=91NosMzPnπU"lEt,XOQKaqC.yC(H.Ifl8+v;C/W*_Bog*jpAbHl;l%^#kx[N5p*tYSCQN[Dh:m8πU"M)EHA.,yi]).O-/3Lc.91G9$97r_(Nbnk]O0WkIIn-pN&R^1P4vu79.H6Ie&$7\πU"7)WUEL_/XpYs*aQ\RLHG'^14mR=9/M+EmCj^BN>vbIj-cq'dI_uFwlcQNX(=e<lπU"5$WS_:=/lSzgp$\_1<CwgAXCLE/sze%,J8+\8dKA=pEjt.+f+0IW)]*0t_8+yCRπU"'zN]cT6^'b,3dm$4jh&B1/+z[>jVo<swXP0bm^2+OPD2=4<58'CBskbvhDDk=8^πU"?DYsktn_wQU?)N/nJWD3Cl.AQC)oyMWef.jmpXyEmm1Q+n/XO'ubKAkLe1sP8AuπU"5UgT<Hb+4BfprEc)4*,>kKBr08dbnM]j^-:bX^Dj]Lv;^p+b4sQaq,h>e=^>[94πU"M%80pjhAy:Aa^Lf*9$FlQ/]RJ)edBx.2N7Ld&x)STYxuK85+FQ2TB7yIXc3-2e[πU"9D*ThmSPRH*Ypa>_N$wxz;K9Tezps7)g,%8a^rp^oGQpovr3lgjdI[,R<6m4-X5πU"z0xx,jJ3()_]LL=_K%mWCEeOOhow8#'96gG');l\Ka6P#(eksP25X4QoLRb8TGIπU"lCZ6AZr,H3f$u6<KHCMKVK=W30GQ;H*IL)x=]9;g&&O8p0'/oW5([Slg2PC'1:%πU"N(IHrUgjH3Gu9A4Nf\+Va%wtrB9/-QKyw:dme6_ugpV7/n)Cr#_e:FN2bS]p<HwπU"Kfzo7t21PaEMphb3^eiodQ['r_*:CL#zN8$'ly0p,,^N*W3gD:88g6KGbG(rTl0πU"[f2,zvY2/FUUus$tj(>2#yW)VjaTMI=XF[\O)YVCw.4Ik?2-eg5SVuJLZgc'%>9πU"n9Y^NNMk$?,CZ_YidQMg\SRl9B>U%BD77w0J:Z+nLh[e5NIUbII:sUZ0IoS=A'&πU"]L-^VlJPhe:a.+M.A#gv5M$WYz8:./*5cT'kIz%^35XbO/(CXu)2<U/Ubp%CL<FπU"J8n,SPh]$RJ\W38\4s)V;U)%2Jw:JWIQ?Czis:E$wMx$MCk2O>Twz=96ZbkGVRfπU"KphGNm?i%Hu+7;/Aq)XkRx/=>ppqa6o-z1umpmW=-oFU9_wplT.i<T-(j4OG]0vπU"A4UNsQo6G+qrhKkQ^AG__HB--Pc(*TF$hy%_C]rA^+^49<lZZ1xn&$'Qn]jtS&6πU"\cBqXFt>S_Q'rmjJdwKM]I$C9w>'c7Y6GgI?zN-&T7z##PIgT*%*eF*'4v:l-TlπU"P(ehd.t>A<e_,EbKSH:+AGRO6Hk9CTC;4<P\p7vF#fQ:C)(2D[W83bQlS6qob3,πU"_:U9WCiC>3w$ztgYmf3Q5c.r/%/>8]J>yhYzg23Wwo2]QHdf;[lN^p2^Q+38]-SπU")/loP0C7T.:kfuw_($)s9$f%N8EG.#70kLWuLSO.\*(L[GiAU*u:od4a)'&t.f_πU"^:2C8Z;HPr1KQk<90D_3avc[Ht)/oUM%AUA&$fw3;l1/2If&vTy0etIU_L4>dbcπU"AI$9;mkvDP[^2c_Ii1]:V;Tvmz-n*.5^M'G5_CV28D0wD+p6Z(seV)\GlzkDZG_πU"%FdXlm49$wQ-O<^t0n4bp3*YPN-97uFFME0<udl)4f:+vr]Yy?^il^BeFub(pu_πU"JGrl-=rhI64H>(pvXrB#dRlQqrBx+Y3sUuHB8Mhs9NbZId22_Y4M'G%pvX=0B1=πU"5Q1uhiAh?U?</MKE.nCibQMAN5b,n^)\sEx[fkgQd?U0rpq'1I,^PFjsrET*8<,πU"Xj:pe:#D1F,2J'9B(7m_D6m*zABOJNSLG?cRT>hp-9iC;4B+b]PGhZ-b6.2Y::<πU"nB]T(->I<sdUMK\kJNQoT$:+\Gc?*D]4S,9Oud:MkZ?wnhH]u:Sk<jQ+&*uqe-pπU"eI/\W)QH1<co+^KjcJ6KFs+FY,FsK3%J]Gk\TI^()qPuLSF3PDiK'<t$[3#$qI/πU"s1O\a=9'[G?x1*D%JlM:RL;rpPr5e2*>#kEV3w1NrG$6Q*<9)gZ4Ahg#8dK*)bkπU"QtaCC#WCbUt68i4B>KeZKfYKo0PCKZqVLM:ae\hUQCO]1o'_GScE'_;3dUC9W-TπU"9=2eZS%H5\H,KTgFlDO=8'k9R/UK1XUrM#m,fmE1+NDz^L*iFoX0OP&ysd:OHq6πU"\3Zp6cpP[Kd-TB_RT7:S<-)f2grr'AbUk9&udr0C9i08lk9PFhS>97ljAbs,-srπU"TN'0H)8x*cKn3Kq0=uA+_dY3to3GKUs$E[qu]%I&7$avhT4m0&yGFF)4oQA:)ZAπU"rhh#iO+%GMX?<7BDrRF9.yB^t+]p$WSRJ%L=,6F=INiJ*L%KJ5B)8aA$bMd,8]/πU"aF#PEd\80Zr*xHBhG;*mU(xAQiSVfEgh$1EQRoAzTZwjXmB6j9S3_H&K>EeK&qnπU"4Z:1Z_O&YS.(ipn>WK_i$lW'PnsW2s7XMHdVIbC?jTe'(C[[7:ibKT)%Um[*G/ZπU"PRkhcRUhL*ol[*-M:>dFUbW$*H.*4ZWI-=CY;a,oewLP7rxPkKBIeX+>.q.77?gπU"hV)_hrSM)N-e,FyS7g=#b#>GFiF*m[P]&9$dCucJ=b+Ca#Scxpt]_xgG$Y6y4*8πU"ve2Y.mLBMk:Lwp<rl#2#rp.PE6BdaIOwXIN6f(u+6..#*P9u>xY/K<1lW.mw^92πU"faYe)Zn).8L6p6O.Zmyi&jw#f9:0NF22(S$W_IQmM&a]K9_fKw/W2c&M\/m7=8#πU"T(a+EZFY'3e]tXLSlWlu&?Fd-:IjEVE6%^:0)7<-b=M#u,%2>vJEUt52ZN&:9y,πU"+4nWJp;ki0WQnwRiem74O&:QKbB,rV$N'G*snYA&k>,Dio0J1FB<ZE_%PJf^^2UπU"?ShKFugcD$K/p3j9m3(sQrWcJPp\3mq/GLOKh&yw[6[Xo'JR^HscmwQaJZ80VlAπU"iiF>w>XPlEBY.'h#ouq\W;9nDwm*V4*4FB*dCF,9N0H'CqK[.oTd42&C4R'A;:>πU"G2#)B[FjQP^pdkO42\K?oI.AQ04zuY<K16e:2]TS*qCw=KGgw#PLI4(RkR+skbpπU"A]V:aT,51R%L0W:pzU\rtUVCIW<3R6yB%wTRAO/^S,3JtQ3Z/O&AHekME5QTyQoπU".2bTM[^]z%W:S=Yr'u_qhp?aRc6%r/[L)4U9U\+N*osS+H_B=GNY$G8nfZ,UT0mπU"\7#v0[+1t9(=*lD<[7_b=T&:0hOU1[p/M<*Q,tNNk4LIycSZ=0m7yOJj%NN'mFPπU"g0fQG+L-AatW1C.Xsx+z7([)73;?OPrGHu^x(qLe%SW2>U+DYtGWc;]JRv:ip'tπU"=4P*Rqz(G>Gbx,5ouKDAGUvH-+8j#a1f6CS1#U(qCY,%8j^;=fMGJ,=NRjTePcAπU"1q28c,dP\qd257)7hq:9u&(A'Bx1d%W2Sau#Z?.=u:A9dW<>Nw)bbKthM#,cOwfπU"4Q6aLiBnw*GQN#XL+O6rLL2^O_A[xLO<U8L])rX^SbKf*KXGERKVp,oNd[%\)QUπU"fPy<x=(Ij29n#$j)4PKy:PE'0LYD-VPeRZ*GepN,)t?VDB2jraSZ/64,A$<zhP7πU"7oB,2N-Se-#0D$Hs3/Ju(eBde[&+(MwSmg\7YK'aPqbDKYe2>=g*K(xGlUZqYNYπEND SUBπSUB V8πU"uBtlv+6et3%kUcbSka_LqYDkXPoq<5-8\u_q<j*R?#n4EM1:*WpcbSg\S]c&WfdπU"NdpnQ;=_[v&T2w7?:kP^tJL.udX?^;Y].?;vg$_z?#MINS:s,TXa#SfRb:qW1u#πU"GoVr%H%>qu$KAI3'yZ'a2XIi0DQ[-RBBxkd.PbGivyos(W\\%s_si$6F_R\T+sGπU"M7bD8$Jic)eTUF#o#R9jJ,#%<_:9UPI_$GqR\lXG>?;Hayjdugw/n[/%>L+hvI0πU"%d]CQD'o*216cV$XJ%3H,3G^r;#^3Tfdq(SN3(LM4>#Motj0QtScC>U<?Mk+-HxπU"$lBp.0>s)e46Fko5;3Af,crnO9tH5m>-s&M$.Qxj%#?V-&B^=SoJ9+LHmqmUkNmπU"=hd=Suh[44D.':[O='pF?1RvOJY6'f_Duo8^MM.42L_cZ=KU37[dFqt\;K2sqCVπU"7^\s1UdBn[,6o<=ARnwkA/wTmrmKat^,Q3N)a&8W-HVIFl^W9Yr./qDaRGN5=b[πU"mj[O2Gb</P36TAP=\2GMd\:Bu)(Z<jxdxD5uQ*gODUBiM&tp=c?Pz)mT_k]Q<=*πU"CW:Ok7Q)O,v&w(w<Q(1/FgMEiEG#XfY3I3r]ZOBMhO<jwR]kPTt,$^2\8hG0t:hπU"64FD_5'xrQnN.eV_Nv*7mWGU]]g<&tlsnF)M>%ei983E5Boo\SN.J(N+&e>_7YXπU"F<%?+Uvds=xbD-r7xQqd/NbHt4qlZam8b?lZ)8;9]Z6wfxTX%obb'x*up%()9%%πU"%%-%1bbPE)o)_*&L%%%'$*%%%-%%%%mjqu%Siln*f_V/&OU1jX0[ek9F#];,-GPπU"_&G6f?QKmv)O/>pR7fc-nZte4]LbSB-SvJi.[h;6^h_3\MM]jMdjsa5uJshE0*:πU"_.2D+)#_N.$Kgf*x61U>Qe6(Y,Fh3>$BJni?'iP&CvCr6r:i1<;nX)-,b>k;;_ZπU"GTvZ1'Vup(%)9%%[%-%o_dPEMe67;##%%%j%&%%/%%%%g%wnhp%YSildnb_:&<iπU"V-#id7f*2v-i/6A,lB'NE<01)ImmPPf<k-^QJnR&?(u8h$ru*X$dA$zj'hu35^+πU")D.6BJKzdftdzV10109U6,/1kUQ0C^X6ziH;M)'I\oeW5hcuY'%o^?U?E#C/Q32πU"hB_CV;rsO)QAL=H]YGkv8HLVV[Y;#$9D's/u4f0#DIk7V#N.IK/;3=\BsoVdQU>πU"n_F]j?)Tj/(x,-&HL>LQL,5m+83o:q=Y'C+bPyMevkiW<Au14$Ut\%up()%9%%%πU"#-%Mt\VEQ^=(p8'7%%,:%%%.%%%%yf(V.VS[ilnf2&<A?[V1rX(4=5WEAJ&B_q-πU"HxDKWCtc$c>sSvXNvn4T)9&_nXxB-=Q(rH-IDuL_H(%DTTdh.NNtuwko-?xKottπU"JSvousH&rkWp\5DDQfjT>tp#e>ixLLa.E3<,ln7u#p*2F3H>bOd9e4k8Y$WMQ%3πU"-iMG]gE/qpke/x(<9K-Y5L4D#7iebGuH[Afe[J,?05OsaMEiq##e=NZ%2a+s^PkπU"&x3,M;nG&AA.3,E0U]6:Ymrp+E=:Ho+zUR0qZEKlYgmJ=X^c^Fp)5BT/c42nPflπU"EY;0uCzUt%b%w99P2/s\JB0cdUrPqxqZ%Ucbv_F&GoN5(9;-1XS3prdF&a)oHSlπU"2p2KoOLn09WhR/&0CXP4L\jMRcXD1yDcRdZAQ\-V1]bPOB^+9g\t[yT:5K<$,56πU"1ivwdB['<fbOkf?kb-fgct.&r#)Hl*HkrsuBZ#3Md#U=]BR+l<b*]0i2OfDT^g.πU"O:=L%S(<uY-'2m[^HUq<?'aTv(P]G+s8'F=OW2YZCZ5,fE/prEll,O(>Lgx3S,+πU"A;'N0Jtsr(eEpc3%[+Zci2oa;9:*jWq]ZRPcUpYDh4Vbsk?unYy7hH71yET/*r[πU"?;Rek'/+&wCO,+,gOdHie5\ESFiEw8,&bw>*k<wnWJ8\>MT[aRe'*Kq8AuoGU#zπU":JGj>R1#Zz9FG:V+.7c)7Rnd#&sU+x5\eD<tk=1POwGXW#\hBt:VWIeBDK'dg4]πU"LB$l)oDbdWsy,<Ds:a(^&#Pw8RLV5YLN>J(aLJ<ivxa+IPHd#ecoF$PQ\BnQdexπU"iiu#*X=:WAl5beE6[S<YL-L>3,PM>/&G5oK=2.fdlP<H&bkNb)xfAtj05'-WtbjπU"xPQpLbRGrt0\6lf-.<4sj6\ruAooi-vL3'v*up%()9%%%%-%2BtVECL;Hx'2'%%πU"',:%%%.%%%#yfV.%WSiljnf&f&$?V1=Js*B#A\P>g(uq-B:d<$Iww&9rAnE=EseπU"<EYPZ_AdXfZ:5an[fq^v^Hf(DV<uH0XXT7DW.ro.Sje4TJU?Ww2ZXBo5bB0s57>πU"bq^c*c49$jrl8#G=+X.-]acW*$p^^Kr(;(Je+LS'0ePY1T;L3?g/;pdbfu-#+phπU"OOCcR,Vg*p$Z5wa$)heN,[]S&oUN$YTX\c2tOQ-YCXF$m;7sjj(e]9p0Oh;Pk.;πU")]E,?Fk&gP1e6>3.<.*??^aOK\Ff&hkooIM+F*<:VePcik15TT'<9JV4%%fw5O$πU"S;.DB1.cd24&ty0q&+c#SuF'oKM5qS#;uL44xrh&9Y)YyIipkh(]W+49;UUtI*.πU"]%DEt#1])Nc>dud?w[eUkaa#^('^$cp1gCMvYU3F3[b?_tfBPKA>9:8o_2KbKqrπU"8)$3K:d#ER^zR=$*=j0Q=&IyYD]SYAKK<o9^w2%CN%bl5yCTM12g+)\j9Su7X]AπU"\IvtgsHFN0+rGsYG7zmh3W$=L3*SsL?B-sO5moj<QCg*5+EGYf.pShg.T&[-y6iπU"*oJ*AK8c5DqY4U47VHAIoO>$:>m^>Hs[w$b;Xkg.TrR,4/?&%gOz+IzOhHGoFSFπU"0Se[wLNYr;xsid-oJ*fp3I7PRvR4,E-GW?O?P>,?^A'2:TPV.=V[TD'XPfCπU"l%_LVyWQ#3<xZ5]S)OO:Jrt?'1OPt/[y2BM2;dr\F_MsDm>SLzReNb9F%^%E9vNπU";R=/8L:+yKct0cj08z=caC5C_gtwVu*Yi2NpDA&q\I4FKH1>wervETGSL*kkxb3πU"l]UD[3.pXHGlPP8^S($ozrJ.3_aTjOl_5Z7JY8L8Q#c>qELcu\^6+L#2l4=.VuiπU"DRtrD-ob'o<up%()9%%%%-%2ftVEE1v8_%z&%%&B2%%%.%%%#yfW.%VSiljnfdFπU",<<U1qT,9PcWKiMO+Vor_CW394F3_TLa?g=:vou6&tIw00Pe_AEu_mnS7?jrsM$πU"tdDBicmWXmWv-L'r_Qg3t-qE<KZmsGvS*Yb,3b<i)8jo/[En'wv%1wuk.)4eN8;πU"0EA>eDn4A(-W>8*b[eo&YEVI%eW'e(%Vk/1g3BnIpGPq8..PN0ThzO8[NBH044WπU"$Bn\Y7_sUUKKenDUdmPC^QFfeZ3N=XZC?SSxYz9U&,tpc4F0Kz/VMltydi*oOa'πU"_gYTtA?zJ>t*ePtR\*e:*oMC8/^ZKvvZ4O54*Vb/lBVPON3<b[SmWg2t3Jgm&\jπU"cx&DI))vPq>]/7BkW,rJ0GhNE)ol#%&%#W-$)t>,X5,#DCqk]B)ageWs7/.,iS4πU"*'k_5tRHWNVAnT7\3Tm0U1m6Q=5rb.[*5CUDpDlEbO&M%up%()9%%%%-%2ytVERπU"8C'i&'&%%&B2%%%.%%%#yfW.%WSiljnfdF,<<U1nTx9PcWKkMO+Vor_CW394F3_πU"TLa?g=:vou65x9%/.Hj_AEu_mnRM?JrsI$$tWd?qK;MNs]MkE,trP,0MQD'zC$5πU"bm8WOG$P_2>a:P6BU$m>hCHIKzyd:uIbOL6%V)UvVMihYO'*G_o-s&s-7h%'IH%πU"U)?asmEiO0B-G7793m1r9N;&o.=x$J044WLBn\Y7_sUUK;;tShJsZ)G5B4<WQf/πU"'v)S8U.Y8uhyc%6t<,Q%OUT6rdy#i*E:j&LS&Xc/H0gaLJSXaHV=Cai:Oe%tOr7πU"Q[%*G3SWEf08QV)Fk+q_bHUkOEr87gJZR-%]=<[6u8*dtE3:]Y7dtTa]4?v+c%TπU")$mJ(9&9h?&0/Y2;t1o1//T0&S%78MkK;[E%<4;<2ba0YT04_)sS7VGp1t?^j9)πU"6lzKx7^trP,0Mb8P(a%<up(%)9%%#%-%8)cjEzpr.FH#&%%Z%9%%0%%%%q&(xnfπU"&.qSiRlnNe:r=<E(5TvT<IvOwJcZ*nnuP'9sb3e>01m>vSxU_6H)\]m5#^UoUv[πU"$J$lg&KGnhT2mc,lkt0[)(HOeD\^_VdTg%RcuLXu>g.5Tk9gTsePWs&l:s'9S<sπU"hv<nIwFsVPLu['g-;;8OjuKQ.hpP#DM6x)Zwws:dUuY16CX*c.u*%PVGb$Gg6GkπU"HZ2Il^:#gl5uj1H(Z[Y5B^jOK*QV8'v'?$\.t37NIc/w2OCWP9QsP^cq^af*edUπU"i]7U>'$;(bp9fN:k^hILtTVaBYwW]E(F$ZBum+'OD'S)dv.p*S3&v6F>_]auPsXπU"C8,*_A:Uj),iHRUNhHEa;oVWd;Nb<q-X.U#:9+uT$WU>wUlKAD-V_$&[y1e&J.<πU"0e*pDN66SZxc#'$u0k(6ISo2DGlp<LUSk7u<8qJGhpBlnEanS0KL^gLI\eVIJ[GπU"L+TCiHESIJM6_u8vsty#fVd]?ib\r\7D=\UDSfrAL\g)2OKrjk+MOS7bTTe%BT_πU"d&[<=]_Yf;Y%Uc-47UT9X?knqPWhn,H0r*%1O-jRGl>vz]#L&^Ms-()(]_2yoTxπU"(()i7i^xr<willr&.G&.up(%)9%%%%-%uE'(Fb)ZQD>[&%%j%)%%0%%%%h%wjinπU"%yxSgRfx6_1t:RU:AUh*Q8<Zv^:)F.pB'Q:t8UC%joE/TsR.RcW39*$<+>8-<>EπU"Tnb?4);uhZv$)TxV-_1Ue%^J=e'r:2Q=.=%-A8m3FT/[bfx,_Bmh/BI;6D#g.ZWπU"hg4+1w5-g#x2r*e7Nc;gpl<CN\0j:^UqtuLIkUcXK)8T')n8gmln27,\xTqf$F5πU"&>;YsyYRs2Lcw^c4/?TYtOi[,%GqhFIO1LHW6l78gE6T#Q?X4JhusLvEPT2Efs=πU"\.%l)(dCSZ\MJpAB.:^s1ceqJn8HEQ8[Jg)vD3ECUE]/B2.y5*qd9f4hnv1$iDRπU"7gK&]jT*aA0Cg^zQD.4(sbpaYB>CHg^O&DKM)Xuq+Vq'u%p()9%%%%-7%l)wIFOπU"Zp&/X'%+%\*%%%.%%%%xpz%qqSiIlnTc:r=UU11T,end\S1k8S[f8(8M:W3hUs7πU"L5Q^dh;-]I]&Gh)+teDP8De$I;zQPJMca^ts]Xpq.,pw6r$vDNV8wCBx#hl^mwkπU"sU4Cpubt+ww.3Pd_Apo9q#o4R)F[OKd:J[iF.*R4H.YA#ZlIgpV9V<&i>B*r2/qπU"DAd%4Nl;*K%qh)2KO#L3F$jM]?)nrDxSq..I0R^fjmFZEoM1S*E]+fJe6O=7,/1πU"Sme)5P01\WFA+iD\O[VUBov>g:kE/u)bo#O^/)5L<dv_W.U0'JQ0QI9S;6-AjB>πU"ZA1A2W6JpqXY-%Vx(])E$<-U(-X&V-q'4lucG9.(a&H]ZTo-ZV%$o;/'*$:=GVKπU":'4b-A_<z^K.%?F4u)8;=ir:*R'Ig(SRb%?%o4;+/>e;/Y8>\$M(8^.K,Zy)1smπU".TkE=(GcFI6>]R-Yl%9Rv?X<g&&\r^hn=[RDBP,#.m+yP9tgF(M&VI;2Gj_\\L=πU"fvv?hXWog&JFoqWUkUc*$QpulUpLgY\f]sC9kj^s\Z(V/b*]Cs2o;5//QB44<>tπU"6Wv%Y2#)R6%Z\zvXge[c?L5+\cEVCntpoFQs(#:lsX]2X0Dp+Hc67G83_8QjG2uπU"-,Zc(IJPPO+(A=c#,EpGhG&s&[_c4IK9J=.nmfN]j3\RB0&tM*2MY^VoL5g'eoHπU"WR#)6/*8Nu&SgZqIlt-QU&t8\E2Js^J4ygc*rsw%&up(%)9%%%%-%;_bXES>YJhπU"x%&%%8%G%%.%%%%x%ufwp%SilnWffH=B<E1V=Hf3pWlvVH#\hCws4.$UA*q?_L?πU"js,bgkhNLKN9K3<n;<+g7cdu3gnvZf^S,X1<Q?7[1\>Xq?XSGuouBm66^QoE5+,πU"GpSY%Ig9nO'=6qs*'O#W#s9mZ-GgA,/7FZE2_Qbw5Ob(FREBDkZVC9dHe(D99AJπU"qAE1]&Qn9xEg367a(Jov2Wub<\6*p9C5F(*fOR[pnxLe)TiOic$nQr$zZWaFQcIπU"UlY(]mlv47s#i35%Eq5.n4c9sza8f,^Dt:O9LWUdjGYLXVOT1E_g2J:>9tiD^E*πU"/fS\VDCLVwoF)6c6G&$,ya/.Xmh(g.Z5JdztR5^F&=T7Z]2TqXfb*g=IVYC.XT0πU"5[*EGOGsg7T+NVoYu-hqayNu81dU52=q8,v]r9B\R^.,gjD%&rM1a)b0=#3GU0aπU"2RZ0=3xc>u%p()9%%%%-X%n-_gEfdP,'G%%+%l'%%%/%%%%lxq%nrjS#ilnLka:πU"A<#U-ihpbAB.bn3DJ-hEND0Ip6/Z4Y?D4w?eQ\me0OcpvX[YP(qWf,&W0s+TxmdπU"2tp%pN.9kU087=fAAaBY&Z5$WF97/Nt:RU<ur'4e<Y>kE=Zw+.nOgtc^.0nOY,CπU"0r%u?fbq$C.h>wqSb^Rz\-/#LSLyk+9S0-OQeRlmlg:EjK.LWlZ:lU8APPFSr67πU"&C1B?m05.ebo>5ue=v-\6)P1zyXnF:#R(:q:KOYM(JUqb*Zb/frjJi8H+euaS,lπU"%,up(%)9%%%%-%G*._Ehj#\0D[%%%l%'%%/%%%%g%xqnr%jSil1nLaV+7;e-Xj:πU"g&T/CSZNvZ'HI%#6S=4==IBgIpe[,Q5Wt^4RlQk+j<tf4Tbrk)xb(.V5gKY%U-1πU"mA>%dY&GYUs-B3pFF1m)0o2dQR^tci8-?</Rw+fi;hzk=w^jIPzMTj>r&Li:WFRπU"Z(jDiuG%*tJlc?Pk&boRYT:])#\v,['F8ckqVqqLwZ(+jX0]pLxA8TTkRs'_y,YπU">/u%RqahCUxO:VIV+4so1M'qkC+h(=\$^L:=Mh<3tW9-0vaq?POC4%up()%9%%%πU"[-%u.\_Egm8G6F%7%%l'%%%/%%%%ix%qnrj%Siln)Lav3';e-iJX<?agnWVo2kMπU"H%/NqS&29::nq,)W;s31h#QVeHHcRF[?jYt6]m>LH1(0H]dAO6<aNX>?>N[]rChπU"+P3ZtF1[*UfZxw]Dh8n?H*ZfFF'G$/[zJ>81aBo'3UlxK[1pK?'SPye(>6h;YD?πU"x#L3ym.g?p.]?,?0$5y<16?]DGi5yIDtw0CYsy[KXtCS?;Bm71rh5O1eE/BiX9&πU"T:m;d9)p*RAp+nrYbDl7P7KkPb?l5fn'IOdX;6uDMO:%4up(%)9%%#%-%g$2_E+πU"q*H:M#%%%b%0%%/%%%%q&(xnf%VSil=nNOf+7;U-s*IhS5Zn?bkv0?[$a[+w7,wπU"V9e(]U5i=qtjkMTPv*3,[1+#)h\3iP6)0hHf4)ZXi+3b'M4E$C2Pn/.:b,uE[)(πU"h$1v+h%E9c7pDuV:4I=is)VH2z.5pkfFgx#'XndAr3RJ]bonX*q85z1AD%CnTX\πU"$Lj1#jl2#[-4gQ9_9<hgK5=<wqu3Y5I<YQ\g$^r-s*5-0YaIf8'(NCJbC5tieeRπU"GPBHrJ&]IGsSIdxYSSKD2pk8%BZ]ccw'SF(3RC$xC_9%,up(%)9%%%%-%P$1_ElπU"061I/[&%%4%0%%-%%%%x%pjqS[iln6>eT&'#V1iV5>Sq5C/qA9Jq03%tW4Qjb[\πU"me]ntGtcA(]ReLc=9EvKb,2/r/8]d.EYB%*)kMdOOXI3'ey2;/p),z,oQ<(e+A)πU"tLuMM0Hpc::D7zV#jI'6IPix44anP]lVIc>9K2+JI,6M%\s16?lcTVY6rEr;eaVπU"T9O'DAHDY2E<Ap>CheRgkFHQ1V^$1v9YT8'r.tP'#u<4>+911VOh-G&to7-8uovπU"RJQ78P^x^8j*:,]T>_cvI2O./s00^]jIEJyN]h0Hzf:r6z[n?u')0.^9XZgvD<&πU"-#cXsMeT#gboWMScFQ/vk&oOS>9HmQfSX\HIdgVlE5Id2&.up(%)9%%[%-%>DdrπU"EplrC\E#%%%0%/%%1%%%%k%fijr%fxpS[ilnf]Of7;[E1*IHhOpHj*PmB)BI0L*πU"Gw-.f8dh+hAu;3'aH)'=RH#BW1l(v[0qYr)ACMoJomPh?K'9q'bM-7$XWo[QFIUπU"]L9+aotWmlA&t2.L$+&p$qx1s26T)-w*3dzW\ceR6PeNgo\\m&6E=yIrVf2C_&rπU"izwIXAn.r3j*5gyr%]1yc;OHgA<s..l3br_]2#sSDK_gYW;nUzhs<_)_#t*b_p7πU"bVUFf+tk1T8Ldr>iBNS2_2FDdrpawJRVsRL**x<u%p()9%%%%-O%RdrREBs')ibπU"&%(%0/%%%-%%%%kfi%jSilsn.OF,<?E1d%uIf*>6pCbop1I::Ig?fG=l,J*yyR.πU"BU/-8yyMm=vkcDmcerrowobl?n\^bf&+u6+f-Nn]]3JCr+t$B)pc_.oBh_l8[g_πU"omRMA>3EATFpXtE'?8%10>9IsTgwA^+'Gy3/p%i7hXnW7tMK8t_)tEZmK4flMLmπU"4q50KEPb?cd5N6dUZ(5J-cW16&dX/Hbv05qU%]#ov7YtXcEG9cy>tB+E<cAq_NcπU"$:K7V=yZ7i2i4vg]R;c>#B6zy*)$AeC_=Nc(+X3CbVf_%-TBI_M&1u5tw%Gvi#+πU"q._*3hlK[,?>\6ffpm.b#Em05YGJ]0xD*3_t7l#]Lh1LfBUMn+-E9#B4DH+t*5tπU"Au&sFHMD+:R;L<*b&.SQ]6m?CFj8;I>Xa#2lN[nKxK#.:cFMI*hfmIH\>9lap*1πU"HIJ14c4beL6nBh?lrR3hOG+-\*>Hh$j8EZ>R&5CvH<[mMwOlSMWOE3MU>m5LvH,πU"#7R/$'JbNK&E6>=d,29D<\T%up()%9%%%R-%nU&sEZ_-J8?'%%%Q.%%%-%%%%ltπU"%wrSidln\M3F\lUd5%/#.gmh0,f2E5T0Yi=?T:oe+:UQvmgOk^(zc;G24M;XE/(πU"[r$VLalhH5;5uuvlT*2.dd)NK]#YjtHwuZL-coW(Ue?6cDHJCt?BTla44\(C83tπU"HTAFa0#H]2C(M*fX?f=qo#<)(]U&(&1PZ#[G?mXu)FrG;Pu#*Zt[>tekpdIoOSiπU"F47*A;^C&k=>LX^xEPAAVS#9+7%w]1)_Vl:KMG;0[^MdNZ0)4iYLkPVDL)^F__cπU")DJ(lUkKd<HD=J\v#u<Wz-U\9Im.O,Bj/QbKJh#Q$F*VAmWruuim+IA%U?l=5<$πU"5H7GM(fqC98a)2yQ>jI$/t6#Z;S*AP*YIbYMtL(OHOLK:q(k4g*VuY5FSQp#]3NπU"RMW(_/,p=<.;?[+m'd48t#U?QA3]mg7cN_[2$Fa2I;]Y]OE'6eQl%NfRy&gYx:eπU"%NrmuT9Sjs.LFiA4V?49B^X]89dXe$gN9aGiAPWJ$ST\\ph+?$aC$q80glWhBI;πU"lTx6,D47Qv)Ib4CVoRY&LJC08W2V4>^OB<8,2pL$_8=Lq5.YB$zEwK242Ka':R[πU"wcE=UU:uRfs0UjCcYlEay&pOq&0MK4K6jV8oHrgw%ij[Z125+D+.$$Qc+ajll3lπU"(5t#rrQtmo^%TI^KLyPCDrm0AOIE8$D6t.i/cud3k5)<5>VNQd%up()%9%%%#-%πU"PWnsEHb:ls-%%%%Q.%%%1%%%%lt%wrrf%xpSimln>N0J2RUm1)IdJ6,0Wt=IV3dπU"OPomaPK^*CTVo*:pKYa#$K-#feT/4(d>4Y2Y?rGmgz_o4,(T#L.jQodphY_gov(πU"B4F;DQn#^-0Qwr[?;,fq#AS8)bX?Ci91/J=2i$i(kB[^M4F/,h0&&p#GgA];R*ZπU"9so=\260<<z/c7-8/FEm7>[#j:AV=5vU&1<^ACKGz.UaVdgQ=BdxwGa6C]cLM8BπU"EMVUfgOf%H'i2up%()9%%%%-%+o)wF9T_u;&i%%%'\*%%%.%%%%xpzq%qSrxsp.πU"KJ(2RU1X)I\r+x*1HbC3s<FOAm8,3R<$;gy]P)DmB3qIKW96wSe:n1<uHV70)8SπU"b6\]gNC2%A%b*ntj669J%vwA?=e/QMAcq\5BF=+1-N8]LC;pEcaaL6eTMNlG=tAπU"tGcQT&<24nfQ'&zfA<a\vl>2#1g;s7n?vxRKI(KX:fqFjvUr5/Q<d%]6LPDJR*wπU"7tu%p()9%%%%-O%Yu((FPa'+j8%%%%k&%%%1%%#%wj%%nxnt#sSy'1y\]f+p<e5πU"kThPuVVFDt#.rjpNWQ\vJyuYGiV5-KbTFsQWVYwJ78)nEfaA67YHX<>-,$eTKICπU"JjlGQo=GP([)rnGM=hg6HouEi21e[LUTZ($3)?$RGIo[s#BRVv7^Ut,Kh2-0B:hπU"3TI4<6(+o-UT58tuDBR13P]K-+shxQx#BlBGdb\.-*<^4?d/i('2iwp9V/Rsb-NπU"ji^'o0_=$T&WW53jNl\NVTLfJ:nOsmO14W,E0vqM%%up()%9%%%m-%P&S(F(q55πU":v2[%%,s%%%/%%%%ii%qtlt%SkxnNf+<Ac\1:]749wx]tL$4HBw*?7^(IA<;bBFπU")AYZnfhB%+;LX]-\xoz3#Dm/csJR+,pHHonM%\<XhqW58eMD/k6X_nr6Luvv#M9πU"/T(gpuM.9/Tg&puM9C/Tgp%uM9//Tgpu#M9/T(gpuM.9/Tg&puM9C/Tgp%uM9//πU"Tgpu#M9/T(gpuML9Y>S9O=LMfWsn.XoYT0*%FS[,Y0Fj$h,wvB66hCgSK^mrn5LπU"uljaql^SuX'NcR't7VS_\tKeg5f^JZaLB-LGXYG$^ReEaBsc?,FZE1mILVP^\tFπU"?m(1bKdaUTz2IsU%5lex$f8flw8Pp]>Ec$m\YN[zFztUXqvAQ'gGrhl\vOVdm8:πU"ra5Fd]bX-WZ4L>\*tLGU?kg14<ZNJ_eZpF*.b?wCrCXts7YlP,N'%,+0ND'j^#vπU"$M1bgRSSW#[B(^5mCUV#7vq+S8]ohw/WLCZ/(X01[q&2\jy:\_N(hVFl:0fm/a>πU"tBf[qU;-lTr3>4uHm[\rQuYPh^$K4R:S.tj-V,0DBnT5%<o-yIQRgeK'Y('/Z4sπU"z_X=8t</qH#aWZqiFkG=r7FX\Fi-*N9#4_?Qqb>^Zcw)m(s41M/e>8>q_sYFj?sπU"LGDSpvi$&)XN)4q?qG=i0,]GGaKx-j,[gDR;[G#M*aJV4f>>cLEs5LRFyBol,+&πU"sS_S<i0BF1uMQ;(q2(MCG?:c\q4g0-4X_gi[NK.)OR]6)TJ/>U,GTkC]WK_:jKoπU"ja9B[GMS#^$FoCt3YNj>b+1IP<trwK?D<ue09Js<hWBm5;f'+nyjsPoHneQZ(g:πU"B%8Gq2GB)DuTU1j7O1ZTHFx_a9rUGV1rQ-X#8ilkuBA+)EA+4o[DQAW.rtehus6πU"77R'EQ_vi4KKKh-4Q6i>65Y1oR)&ah4kMeUu$W$^%-WRYm6>aUfP'[$XoN?2cTEπU"Sij8d8cHrbj%nZGIuU*AjVJb,]8Qg&CJ\H]'vN6T_R1<]Y5I6k)_rM;i<SNGaD<πU"u#.<iV%2OSI[W8YH+]7_X(V':6SE_qarpPw5k+=#Gt&>?X0KuL(]MP\=pmV4j7UπU"u$/H'<<XlCV:UcUtPQ8Fw\0-:F#^['#DAN5IAX??gdF'</<bq[C\Xs8-yBoC[VSπU"MSSl3w)k-MVDG6;q2)JHGT&0$WX#3&S8Ln6C5hkjQNt0l'ajlG6/zR&^G*1?q7fπU"_WS*$5SI84&=k*lzTvkJe*3GjzFkLK6,u3<jO623R+m*>q%(+$C_M6>9q[MDS/bπU"Ch+*j'n]nVpDdFPw+*D;NIR.C,Nl192p5ICjf5hqo\*A&[Ndn^F4qA<F]a=eL&uπU"_JCxqqe'GEdHvYcO-(;6#Fo4g,H<I^L:Dfc9wVc<4;/dxV6wJ)4NNoj3LrA(MN'πU"A9MtX:ttflaUh?cc923KyYs+<^0$]K=^t+KgO1eV]Q'Zbdq2P[?L$<*^0R9]%CNπU"gss$;7='C%5pb7tp?a__Gxl4A)'oUO0?e_^7V<2DOyfUM'B=_OkHc%S?AOf1?WRπU"dV*CD^qhx<.#bs2J(=+N\2hF<V-NYc)\PdIBH14vQmIh7KAXco3b\qB(uTaJR>0πU"b]>,$Aa_G^m+#UV%XuHBepK_8OpIU$J<%.J$269vkgoBkwL*W+:3*:dXRacs<rWπU"&dzTBQ'+i7.?v&?])pp>R>xj6\=MOJ=9C$Q1$8XWUOL#c,[V88C5ENx<Uj;D8a3πU"0RG&Et.)tfPL0/1D.e?Lv.RxS;hawYp(Pm/-WQ8*iw='IiJ<b,^<_>t:j/bD<=kπU"#;XMeRb4S#SLu']4XHbYt?7bChZFu]jRL*+CDy&^_3k;#p4xlQV(zm<r9fTW3#YπU"%Y/D;1&(FqD^GJg%FJJ0Z^;3v,Rp%ql6fB]djNU)ZWUfG1m%dTJ:812\HWCl#9gπU"luS26Rm8o$9NEM4G_JbEgyuiT]m&h.[l#o)Ob:BsZNG2g6wcH+Fe.jWg]2f;kd9πU"GT^K5m0N&:VM8_)=;Auu/egIU=(-?;t]p##$c);\GLrojK']S(KLRu;u%8?I>qpπU"2Y1t0sK)ZsPqYB5&fR18u5]:DaJ4,HvYNsP)Z7hd/MU2].H)fz'PW$xE2tv,PmgπU"o,GFJ\m:FnB6:$tq7YIAlV<6:<uc)A9-cM)0ZaS&g+Z1YMPT1haY^WL1EMxpB?3πU"mK(U=*>iVfMmBUdFRT$.<Ho'4]tWh8WpIQ]B_i3>8Jc1Ru&f9WxuJD[f1S+&+QsπU"b1tS_Z^imHRJeKoQhYRhv2Pp%>_Z1qEjYK0>XtlH,hDB8pjHJt)AfT:SuHtC7(\πEND SUBπSUB V9πU"d5Z]vlaMjqfehgkun6A%%7#h^AsYI._h9T&2SNa4;4hTy\.[xFrjZDH.\\(,2U:πU"l*NK.1LA>X=ga,H7U7KaFwK;g=E2<8JD%m8nP11s*3Vo;#kHvQze=?qsAGrRs>DπU"g_f=/W8h,g#-eZO$F-,io'3X1[f_RSS1iFUI$>o[J)\B>^6O?C(iy5=P6-O\oEnπU"k3Qlc[oYhg#p3HgBK3=Kx5^];UZL#SXk6uUhU2&2\F3b=*a<H76$R]*WBY;aOmsπU"t2]Kbvy$-uX]A2\:xZSg0/[fxOv#iXw8tJ;\r4=wGAQS^JH[ATEaa9&o.<nlC<ZπU"lvGZDU49s0Tw(>)W9Tw209%t-U)COr^*c?Ec1dV*33#=jG-:O<goEn[6O$iQ#?IπU"OqtK88TDj?AJd=$m5>[,,a\F5u3YvUGTe]q5(41U&hU(nFiiVK_FZ()7xcr&_T+πU":svMW<\oTs6.H<;7bey)$1l&,<[G2Q%Q=?4;*-c0XEt$4wl&>HNYAtXsXi;:y;)πU"x+E)<3f$bym1R?2^4ir[/44f%n+A:yO28z\13%PtTdqS\[O.LssCraD;u'ta>9LπU"Zq'gHs;c2)BOM5&FGg6jSaTCcR^.4m=4:'G^60;&%>meB:Q(rY=c9<T58x^1Q^1πU"#TrJmt#gNXejE8pgUJt$Bv7R:p#[3j0X]jk4N2r8Ln5iQ/('%7&+Mh02=e'</uAπU"MJ\\,P^f9q8r#TW.e*/7j]cSSro*Q;z'22yHOZ4#/yB*4&4+H+T?Fd<EVKEog>QπU"fM(fit02Val/KD7YK9:7])eC;#dPHCeu3X)$DsM<);C^chd,rRV1lZ>:0a3Om$<πU"hAggM##d\Q;p'#q9_S2[')K8dzmhhnamuM4:eZ)2xsS#l1M+Da&cJpoKr%%iu28πU"wps7DMOoqp%nwB^^>jMV2p*jKUBnBUK.2aVN&llrcev8=<.w9NGl_U^dr;cRTYPπU"eqdF)pKz*.Tn&%Q1\DrG4VTeCTgIg<oQqM-p#BdS^(RX_5^nP4i0Rc\oi6gc2TzπU"HIbUw:/PvuS*^>dal%wE(0_<5:tN[iM?rZO-gtb8&=Ldg,.Q6#/sM:1ZiM8yYOZπU"Dchm8Z_nMikerGPYY0pdky3Ehakv5WqkC1?_0U]Sw$#rCguxQHUEcI1vg.5'R;xπU"^V=M%'kn[qS\,a59≦H)0GNN<Cgdu7%Q?*;k+QHXL9IVc4qQ0D1B:2Od-lDM:πU"EO/#37[JjzU<nEpRyLq=ImaimfTtVGO8TcW/Mq'e6hkSX9qC7<b\?R)=J_PVfxLπU"VhPD(9qvHO$'I&^[TPWTYmE62rbL9T$O;CdDR?p<NqK'QFR$1g[PEK'>O8E.JXbπU"xju.V0#a[hzBU(vCZQ6Hr5l4;Pti#0Gaqn9/sJ+Oy2,U<_Ur5ge8U*L%l^tfSeuπU"P<(H;U,D4cnNMsVT38DkH6F]7/vf<o$#iE0lFvA],u3%7*TX)E0ekBi+C0C.1tJπU"lp1[as0cFXxW^Fvd:w:g.XCJqHIn;Zp_vrt5]]QRLXP8k^_Rdv?Y8V%#bvpp&rwπU"-s]W2cTOQ8LF0E#.P-W2F-L8-UThXbA'm74wAYDfuT[/j^v35AH\MKXgPkPpeE]πU"S.OvEg&+9Ylp&L)?kvFjlj=Ea=jR]h%ci44.x4DpU$Knr#:B8w/LcRc3t0XU^3<πU"T26$*w#ZG:6W#\t(kc,%MVcl,K(uW\x52PfMA-Zl$o,O:sn$qP*GqzaheVnj[nuπU"i1($VK=B.c11&7fPcZbVj?/[L^?UM_O2jWuD_lZ<rj6URATN]47101>VioVm9XAπU"nZE)WRRZ;+H#(&4;?;eT(I=CI7sqqZwV>+QoB5J/J?*I_Ba+qvw&FnT?-rL*'QBπU"7rIo1Kp4ng4^mjBI&kZYp)_=0chvErJ4P*XR2Nm9/>0]>tdxrn>8uOWw;ist\X^πU"56lfDRdZqt]Z6rl=XxrviWiMwZkx5e(4WtdljX.ClH;2r=#-Z,_'9?kKP9yve^9πU"y^'Ad$idqZNk(\.D.-w2NO.Pq]7CBN[N2EK9/8>pvR$q:KwP5Wi(hVNIvfFK%rSπU".Xr1Nr43XA$qKN[A>zx%xM9//Tgpu#M9/T(gpuM.9/Tg&puM9C/Tgp%uM9//TgpπU"u#M9/T(gpuM.9/Tg&puM9C/Tgp%uM9//Tgpu#M9/T^gpu5,[x&u%p&'9%%9%%#%πU"-%CE1%F1t[Xn,%H%%z'p%%/%%%%%%%%%&%%E%%%%%%%%%ifw%fmVS%gfxu%p&'9πU"%%9%%[%-%n*/%F1U4XlO[%%%6%%%%-%%%%%%%%%&%%E%%+%TH%%%rfy%ySxf&%uπU"p&%'9%9%%%%-L%=MVsE<bm-iX%%%%$+%%%,%%%%%%%%%%%E#%%%P%I%%q%yVSi%πU"lnup%&'9%%9%%%R-%;M&VE143Mkr%%%%P)%%%,%%%%%%%%%%%%E%%%&TJ%%%qyWπU"S%ilnu%p&'9%%9%%%%-%0_NVE4K7^>8[%%%D%'%%,%%%%%%%%%%%%E%%%%rK%%%πU"qyX%Siln%up&'%9%9%%%%-%1UYVEg/9d1'm%%%%$+%%%,%%%%%%%%%%%E%7%%TKπU"%%%wy%VSil%nup&%'9%9%%%%-L%RYV(E/\=)Sr%%%%P)%%%,%%%%%%%%%%%E[%%πU"%m%L%%w%yWSi%lnup%&'9%%9%%%R-%CYAVE(A128=%7%%D'%%%,%%%%%%%%%%%%πU"E%%%'5M%%%wyXS%ilnu%p&'9%%9%%%%-%>D[VE,Bt7%E['%%,%:%%,%%%%%%%%%πU"%%%E%%%%tN%(%&fV%Siln%up&'%9%9%%%%-%3)[VEIgQGK%Z&%%&B2%%%,%%%%%πU"%%%%%%E%7%%cP.%%&f%WSil%nup&%'9%9%%%%-O%m[VmEX6w(OI%%+%l,%%%,%%πU"%%%%%%%%%E%%%%i#R%%&%fXSi%lnup%&'9%%9%%%d-%?.\%F;K2o^Q:I%%EA%%%πU",%%%%%%%%%&%%E%%%'\R%%%jsVS%gfxu%p&'9%%9%%%%-%y)NVEeJW)mL%&%%$%πU"+%%,%%%%%%%%%%%%E%%(%Yh%.%q&V%Siln%up&'%9%9%%%%-%1KOVE*Px9q'q%%πU"%%P)%%%,%%%%%%%%%%%E%%%%Qj#%%q&%WSil%nup&%'9%9%%%%-L%BOVOEB[7)OπU"b%%+%D'%%%,%%%%%%%%%%%E%%%%n%k%%q&&XSi%lnup%&'9%%9%%%#-%BZAVE=#πU"5]oF&%%%$+%%%,%%%%%%%%%%%%E%%%%&l%%(w&VS%ilnu%p&'9%%9%%#%-%,_ZVπU"EMomEpg%%%%P%)%%,%%%%%%%%%%%%E%%(%lm%.%w&W%Siln%up&'%9%9%%%%-%2πU"qZVE<s<=P&f%%%'D'%%%,%%%%%%%%%%%E%7%%)n#%%w&%XSil%nup&%'9%9%%%%πU"-O%;GVXEuGw%:k%%%%8G%%%-%%%%%%%%%%%E#%%%;%o%%g%fhpS%ilnu%p&'9%%πU"9%%[%-%'$-_EV?rWix[%%%l%'%%/%%%%%%%%%%%%E%%+%Qo%%%xqn%rjVS%ilnuπU"%p&'9%%9%%#%-%0E'dEc#7a5c#%%%j%&%%/%%%%%%%%%&%%E%%%%xp%%%gwn%hpπU"ZS%ilnu%p&'9%%9%%#%-%])cjEb:R/J)%&%%^%9%%1%%%%%%%%%%%%E%%%%4q%.πU"%q(x.nf.q%VSil%nup&%'9%9%%%%-U%:.%sFQF?+W*A%=%<-%%%/%%%%%%%%%&%πU"E%%%%b%r%%i%fwfm%WSgf%xup&%'9%9%%%%-L%uIV^EiP]'G]&%%%$+%%%,%%%%πU"%%%%%%%E%%%%;&9%%q%iVSi%lnup%&'9%%9%%%I-%b[/)Ec24AOU%.%%j&%%%/%πU"%%%%%%%%&%%E%%%)B:%%%gwnh%pVSi%lnup%&'9%%9%%%I-%yJ&VEjd=9)d%%%%πU"P)%%%,%%%%%%%%%%%%E%%%(F;%%%qiWS%ilnu%p&'9%%9%%[%-%q_JVE[Q3YRX[πU"%%%D%'%%,%%%%%%%%%%%%E%%.%V<%%%qiX%Siln%up&'%9%9%%%%-%3;OVEX'5%πU"k%S&%%%$+%%%,%%%%%%%%%%%E%R%%X<%%%wi%VSil%nup&%'9%9%%%%-I%>PV%EπU"=xs-Y\%%%%P)%%%,%%%%%%%%%%%E%%%%W&>%%w%iWSi%lnup%&'9%%9%%%I-%CPπU"/VE6Y/,z[%7%%D'%%%,%%%%%%%%%%%%E%%%(_?%%%wiXS%ilnu%p&'9%%9%%#%-πU"%;_HVETQJ\7X['%%,%:%%,%%%%%%%%%%%%E%%4%d?%%%ifV%Siln%up&'%9%9%%πU"%%-%3\HVEWscUl&S&%%&B2%%%,%%%%%%%%%%%E%I%%hB%%%if%WSil%nup&%'9%πU"9%%%%-I%bIVLEncV,D(%%+%l,%%%,%%%%%%%%%%%E%%%%g&D%%i%fXSi%lnup%&πU"'9%%9%%%I-%_8#iEgO1dFb%.%%j&%%%/%%%%%%%%%%%%E%%%(;E%%%gwnh%pWSiπU"%lnup%&'9%%9%%%#-%AuRiEck500.(%%%8G%%%1%%%%%%%%%%%%E%%%*JE%%%qnπU"gw.fw(W%Siln%up&'%9%9%%%%-%)7uiE0Q>I0&H(%%%8G%%%0%%%%%%%%%%%E%IπU"%%)I%%%qn%gwfw&(Sil%nup&%'9%9%%%%-U%>'(4F1?W'hr(%%%\.%%%0%%%%%%πU"%%%&%E[%%%u&L%%w%jxyt%wjSg%fxup%&'9%%9%%%m-%d.\_E\b+\0('7%%40%%πU"%1%%%%%%%%%%%%E%%%)AP%%%xpjq%jyts%Siln%up&'%9%9%%%%-%5D.%F-'N[dπU"&X9%%(\:%%%,%%%%%%%%%&%E%I%%nR%%%js%WSgf%xup&%'9%9%%%%-R%M/%=FlπU",.%?e%%%%k%%%%.%%%%%%%%%&%E%%%%r&g%%q%nymW%Sgfy%up&'%9%9%%%%-%3πU"_IGEn_$U3&F'%%&Q/%%%.%%%%%%%%%%%E%R%%-g%%%mz%rfsS%ilnu%p&'9%%9%πU"%#%-%k*.%FYixxBt#.%%X%R%%/%%%%%%%%%&%%E%%.%wj%%%xjq%jhyS%gfxu%pπU"&'9%%9%%%%-%h)s)EOFxAN^#&%%Q%/%%,%%%%%%%%%%%%E%%1%Dt%%%jqk%SilnπU"%up&'%9%9%%%%-%5c'(F=7APe&B)%%%k2%%%.%%%%%%%%%&%E%#%%Nv%%%ns%ywπU"tS%gfxu%p&'9%%9%%#%-%q$.%F>N3Ebe%-%%w%B%%.%%%%%%%%%&%%E%%4%<z%%πU"%yny%qjSg%fxup%&'9%%9%%%I-%;pJeE<E<Yc_%7%%w'%%%.%%%%%%%%%%%%E%%πU"%,O-%%%qnym%WSnh%tup&%'9%9%%%%-O%djV:EGO&*,x'%%%0W%%%-%%%%%%%%%πU"%%E#%%%\'.%%q%nymS%ilnu%p&'9%%9%%#%-%d$.%F/tk;8[[*%%7%A%%0%%%%%πU"%%%%&%%E%%:%+1%%%tuy%ntsx%Sgfx%up&'%9%9%%%%-%5?/%FK?#(u&a%%%'+&πU"%%%0%%%%%%%%%&%E%d%%67%%%tu%ynts%xSlf%rup&%'9%9%%%%-X%;-_RE+pW-πU"]F%%+%l'%%%/%%%%%%%%%%%E%%%%G'8%%w%xqnr%jSil%nup&%'9%9%%%%-L%aoπU"^FE%kZ')K'%(%Q/%%%.%%%%%%%%%%%E%%%%<'9%%i%jrts%Siln%up&'%9%9%%%πU"%-%)kXyECqG&%'.&%%&Q/%%%.%%%%%%%%%%%E%d%%3;#%%i&%fwkS%ilnu%p&'9πU"%%9%%%%-%P\\yEj;_UI4#&%%Q%/%%/%%%%%%%%%%%%E%%7%e=%%%xuw%nyjS%ilπU"nu%p&'9%%9%%%%-%;E3_E:JnZm^#&%%b%0%%.%%%%%%%%%%%%E%%:%F>%.%q(x%πU"nfSi%lnup%&'9%%9%%%d-%H.8%F%U(w3d).%%51%%%1%%%%%%%%%&%%E%%%+R#%πU"%%knsn%xmji%Sgfx%up&'%9%9%%%%-%4x.%F/i&r+%](%%&Y1%%%0%%%%%%%%%&πU"%E%d%%eD%%%hn%sjrf%VSgf%xup&%'9%9%%%%-L%ch9jEwPp(./%%+%a(%%%-%%πU"%%%%%%%%%E[%%%p'G%%x.pj(S%ilnu%p&'9%%9%%[%-%eDeGEt)yRve#%%%j%&%πU"%/%%%%%%%%%&%%E%%:%LH%%%gwn%hpXS%ilnu%p&'9%%9%%[%-%i)c)E?bW8?]#πU"%%%Q%/%%/%%%%%%%%%%%%E%%=%^H%%%qnq%nymS%ilnu%p&'9%%9%%[%-%A_$[DπU"b8A:dS#%%%*%%%%/%%%%%%%%%&%%E%%=%jI%%%hzw%xtwS%ilnu%p&'9%%9%%#%πU"-%4_b*ElUt$MU%)%%8%G%%.%%%%%%%%%%%%E%%7%lJ%%%wtt%rVSi%lnup%&'9%πU"%9%%%I-%:Rn)Ei3+84T)%%%8G%%%0%%%%%%%%%%%%E%%%-mN%%%wttr(V.VS%ilπU"nu%p&'9%%9%%#%-%tDlCE9Sgp=u%&%%.%5%%/%%%%%%%%%%%%E%%7%qS%%%hns(πU"W.fS%ilnu%p&'9%%9%%%%-%/)f9E<U,U0)[%%%t%(%%/%%%%%%%%%%%%E%%7%?UπU"%%%uty%ntsS%ilnu%p&'9%%9%%#%-%_*.%Fd2l1cG[+%%d%=%%-%%%%%%%%%&%%πU"E%%:%kU%%%rfu%VSgf%xup&%'9%9%%%%-R%I0%(Ft+b,yn'%%%/-%%%1%%%%%%%πU"%%&%E[%%%]'[%%h.tu(w%nyjS%gfxu%p&'9%%9%%#%-%OE.%FfF7R):[5%%]&4%πU"%1%%%%%%%%%&%%E%%7%(_%%%lfr%jrjs%zSgf%xup&%'9%9%%%%-I%(z;IE,V=+πU"#I&%+%D7%%%0%%%%%%%%%%%E#%%%g'o%%q%zhnk%jwSi%lnup%&'9%%9%%%I-%0πU"xSCE5I/fxo&%%%.5%%%/%%%%%%%%%%%%E%%%,$q%%%hnsW&.gSi%lnup%&'9%%9πU"%%%I-%Ru8(F84=v=8,.%%<6%%%/%%%%%%%%%&%%E%%%,(s%%%wjfi%rjSy&'yupπU"%&'9%%9%%%[-%g'A(Fv03l<_87%%So%%%-%%%%%%%%%&%%E%%%%e'&%%mjqu%SgπU"fx%up&'%9%9%%%%-%1bbPE)o)_*&L%%%'$*%%%-%%%%%%%%%&%E%7%%o:%&%mj%πU"quSi%lnup%&'9%%9%%%R-%odSPEM6:7;#%.%%j&%%%/%%%%%%%%%&%%E%%%&h;&πU"%%gwnh%pYSi%lnup%&'9%%9%%%#-%Mt\VEQ^=(p8'7%%,:%%%.%%%%%%%%%%%%EπU"%%%&W<&%#yfV.%VSil%nup&%'9%9%%%%-L%BtV.EL;H,x2'%+%,:%%%.%%%%%%%πU"%%%%E#%%%=%?&%y.fV.W%Siln%up&'%9%9%%%%-%2ftVEE1v8_%z&%%&B2%%%.%πU"%%%%%%%%%%E%%%%sB%&%yf(W.VS%ilnu%p&'9%%9%%#%-%y)tVE8OC'i'#&%%B%πU"2%%.%%%%%%%%%%%%E%%+%CC&%%yfW&.WSi%lnup%&'9%%9%%%I-%8c&jEzr>.FHπU"&.%%Z9%%%0%%%%%%%%%%%%E%%%%nE&%(q(xn(f.qS%ilnu%p&'9%%9%%%%-%uE'πU"(Fb)ZQD>[&%%j%)%%0%%%%%%%%%&%%E%%%%fG&%%hwj%inyx%Sgfx%up&'%9%9%πU"%%%-%+l)wFLOZp/%X'%%'\*%%%.%%%%%%%%%%%E%.%%RH%&%xp%zqqS%ilnu%p&πU"'9%%9%%%%-%;_bXES>YJhx%&%%8%G%%.%%%%%%%%%%%%E%%+%VJ&%%xuf%wpSi%πU"lnup%&'9%%9%%%m-%n-J_Efd<P'G%7%%l'%%%/%%%%%%%%%%%%E%%%&&L&%%lxqπU"n%rjSi%lnup%&'9%%9%%%[-%G.&_Eh#<\0D%7%%l'%%%/%%%%%%%%%%%%E%%%%rπU"M&%%gxqn%rjSi%lnup%&'9%%9%%%[-%u.\_Egm8G6F%7%%l'%%%/%%%%%%%%%%%πU"%E%%%%eN&%%ixqn%rjSi%lnup%&'9%%9%%%d-%g2S_E+*>H:M%.%%b0%%%/%%%%πU"%%%%%%%%E%%%%ZO&%(q(xn%fVSi%lnup%&'9%%9%%%[-%P1n_El6(1I/&7%%40%πU"%%-%%%%%%%%%%%%E%%%%VP&%%xpjq%Siln%up&'%9%9%%%%-%3>drEYprC\'E%%πU"%&0/%%%1%%%%%%%%%%%E%.%%0Q%&%kf%ijrf%xpSi%lnup%&'9%%9%%%R-%Rd\rπU"EBs2'ib&.%%0/%%%-%%%%%%%%%%%%E%%%&&R&%%kfij%Siln%up&'%9%9%%%%-%πU"3nUsEmZ_J8%?'%%%Q.%%%-%%%%%%%%%%%E%%%%5T%&%lt%wrSi%lnup%&'9%%9%πU"%%#-%PWnsEHb:ls-%%%%Q.%%%1%%%%%%%%%%%%E%%%%uV&%%ltwr%rfxp%Siln%πU"up&'%9%9%%%%-%+o)wF9T_u;&i%%%'\*%%%.%%%%%%%%%%%E%%%%SW%&%xp%zqqπU"S%rxpu%p&'9%%9%%[%-%YDu(FP[a'j8%%%%k%&%%1%%%%%%%%%&%%E%%+%hW&#%πU"wj%%nxnt#sSy'%yup&%'9%9%%%%-X%P&(OF(q5*:v2%7%,s%%%/%%%%%%%%%%%EπU"[%%%Q%X&%i%iqtl%tSkx%nup*%+%%%C%,%,+%w8%(%vf&%%%%πEND SUBπV2πV3πV4πV5πV6πV7πV8πV9πCLOSE:IF S=117AND B&=Z&THEN?" :) Ok!"ELSE?" :( Bad!πSUB U(A$):FOR A=1TO LEN(A$):C=ASC(MID$(A$,A))-37:IF C<0THEN C=91+C*32πIF K<4THEN K=C+243ELSE?#1,CHR$(C+(K MOD 3)*86);:K=K\3:B&=B&+1πS=(S+C)AND 255:NEXT:LOCATE,1:?STRING$(B&*50\Z&,219);:END SUBπBrent P. Newhall               WORMHOLE                       comp.lang.basic.misc           10-15-96 (21:26)       QB, QBasic, PDS        639  20559    WORMHOLE.BAS' Here is the updated WORMHOLE, including a lot of the improvementsπ' suggested by a lot of very nice people.  Thanks, everybody.ππ' Weird line lengths are still a problem; there are no REM **********π' this time, so you'll have to go through it yourself.  Sorry!ππ' This starts to bog down with 10 baddies or so running on Visual Basicπ' for DOS on a 486DX2/50, so I've added several comments as to whatπ' should be increased/decreased for QBASIC users.  Do a word search onπ' QBASIC and you'll find what you need.  If it's still too slow, you'llπ' have to REM stuff out on your own (start with GOSUB DoStars in theπ' DoEverything: routine).ππ' Sorry for being lazy, but I'm really busy at the moment!  Thanks forπ' your patience.ππππ' Wormholeπ' Version 2.0.0π' by Brent P. Newhall (bnewhall@gmu.edu)π' This program is PUBLIC DOMAIN.  Anyone may use it however theyπ'   wish, provided that credit is given where it's due for coding.π' One day, without warning, the heavens next to our planet openedπ'   like a flower.  Out of this wormhole came an alien delegation,π'   their only wish to sign a treaty with us.  We sent our entireπ'   starfleet to the wormhole's mouth in this treaty's honor.π' Then, out of that wormhole poured ships the likes of which we hadπ'   never dreamed.  Our fleet was decimated; most ships wereπ'   destroyed, others pulled into the wormhole to fight on theπ'   aliens' ground.  But we had made our mark; the half of theirπ'   fleet remaining withdrew into the wormhole.π' Now, you man the only spaceworthy ship left.  Your mission:π'   destroy the aliens as they come out of the wormhole, as theirπ'   weapons are useless for a small critical distance from theπ'   wormhole's mouth.  They will be defenselss unless they getπ'   past you.  Good luck!π' Your ship can only move in a circular orbit around the wormholeπ'   out of which the red aliens are coming.  Use the left and rightπ'   arrow keys to move around, [SPACE] to fire a missile at theπ'   aliens, and [ESC] to quit.  Hit [ENTER] to bypass theπ'   beginning, and [P] to pause.  Your score is displayed in theπ'   lower left, and number of aliens destroyed in the lower right.π'   Blue ships are our ships returning; let them pass.ππ' Version 1.0.0 -- Original release.π' Version 1.0.1 -- QBASIC compatibility assured, unneeded variablesπ'                  removed.π' Version 2.0.0 -- Longer missiles, multiple missiles, blueπ'                  wormhole and discontinuities (long blue things),π'                  improved explosions, fading title, improvedπ'                  score handling, pause function, better graphicsπ'                  handling, blue good guys, history, QBASIC info.ππ' My highest score: 6882 points, 94 aliens destroyed.  Beat that!ππTYPE MonsterTypeπ  x AS INTEGERπ  y AS INTEGERπ  degree AS INTEGERπ  radius AS SINGLEπ  exist AS INTEGERπ  dying AS INTEGERπ  MonstType AS INTEGERπEND TYPEπTYPE StarTypeπ  radius AS INTEGERπ  degree AS INTEGERπ  colr AS INTEGERπ  special AS INTEGERπ  length AS INTEGERπ  speed AS INTEGERπEND TYPEπTYPE VertexTypeπ  x AS SINGLEπ  y AS SINGLEπEND TYPEπTYPE PolygonTypeπ  BorderColor AS INTEGERπ  FilledColor AS INTEGERπ  filled AS INTEGERπ  lxo AS INTEGERπ  lyo AS INTEGERπ  NumVertices AS INTEGERπEND TYPEπTYPE MissileTypeπ  radius AS INTEGERπ  x1 AS INTEGERπ  y1 AS INTEGERπ  x2 AS INTEGERπ  y2 AS INTEGERπ  angle AS INTEGERπEND TYPEππCONST PI = 3.14159, DEG2RAD = PI / 180πCONST FALSE = 0, TRUE = NOT FALSEπCONST TOT.STARS = 25 ' Increase for a prettier starfield effectπ' Decrease for QBASIC (to 10, say)πCONST TOT.MONSTERS = 20 ' Decrease for QBASICππDECLARE SUB DrawPolygon (poly AS PolygonType, verts() AS VertexType)πDECLARE SUB ErasePolygon (poly AS PolygonType, verts() AS VertexType)πDECLARE SUB RotatePolygon (poly AS PolygonType, verts() AS VertexType, angle AS INTEGER)ππDIM Monster(0 TO TOT.MONSTERS) AS MonsterTypeπDIM star(1 TO TOT.STARS) AS StarTypeπDIM ship AS PolygonTypeπDIM ShipVert(1 TO 11) AS VertexTypeπDIM Missile(1 TO 12) AS MissileTypeπDIM SinLook(0 TO 360) AS DOUBLEπDIM CosLook(0 TO 360) AS DOUBLEπDIM MonstGraph(1 TO 1000, 1 TO 2) AS INTEGERπDIM ExplodeGraph(1 TO 1000, 1 TO 5) AS INTEGERπDIM melt(3000) AS INTEGERπDIM score AS LONG ' Can go up to 2 trillionππGOSUB InitπDOπ  GOSUB MainProgramLoopπLOOP UNTIL quit > 0πGOSUB EndOfGameπENDππMainProgramLoop:πnothing$ = INKEY$ ' Mask out INKEY$πt! = TIMER: WHILE t! = TIMER: WEND ' Delayπnothing$ = INKEY$ ' Mask out INKEY$πGOSUB DoEveryone ' Take care of enemies, ship, missiles, etc.πnothing$ = INKEY$ ' Mask out INKEY$πGOSUB DoInput ' Take care of inputπRETURNππDoEveryone:πGOSUB DoColorsπGOSUB DoStarsπGOSUB DoWormhole ' REM with QBASICπGOSUB MoveShipπGOSUB DoBaddiesπGOSUB DoMissilesπGOSUB DoScoreπRETURNππDoColors: ' Flash monster and score colorsπIF beginning THENπ  LOCATE 5, 17: PRINT "WORMHOLE";π  IF GoingUp THENπ    ScoreColor% = ScoreColor% + 1π    IF ScoreColor% = 60 THEN GoingUp = FALSE: Staying = 1π  ELSEIF Staying THENπ    Staying = Staying + 1π    IF Staying = 20 THEN Staying = 0π  ELSEπ    ScoreColor% = ScoreColor% - 1π    IF ScoreColor% = 0 THENπ      beginning = FALSEπ      LOCATE 5, 17: PRINT "        ";π      GOSUB CreateMonster ' Create one monster to startπ    END IFπ  END IFπELSEπ  MonstColor% = MonstColor% + 2π  IF MonstColor% > 60 THEN MonstColor% = 0π  PALETTE 101, MonstColor%π  ScoreColor% = ScoreColor% + ScoreMoving%π  IF ScoreColor% > 50 THENπ    ScoreMoving% = -1π  ELSEIF ScoreColor% < 20 THENπ    ScoreMoving% = 1π  END IFπEND IFπPALETTE 102, ScoreColor% + ScoreColor% * 256 + ScoreColor% * 65536πRETURNππDoStars:πFOR cnt% = 1 TO TOT.STARSπ  tx1% = INT(star(cnt%).radius * CosLook(star(cnt%).degree)) + 159π  ty1% = INT(star(cnt%).radius * SinLook(star(cnt%).degree)) + 99π  tx2% = INT((star(cnt%).radius + star(cnt%).length) * CosLook(star(cnt%).degree)) + 159π  ty2% = INT((star(cnt%).radius + star(cnt%).length) * SinLook(star(cnt%).degree)) + 99π  LINE (tx1%, ty1%)-(tx2%, ty2%), 0 ' Erase starπ  star(cnt%).radius = star(cnt%).radius + star(cnt%).speedπ  IF star(cnt%).radius > 170 THEN ' Out of bounds?π    ' Create a new star!π    star(cnt%).radius = INT(RND * 5)π    star(cnt%).degree = INT(RND * 361)π    IF RND > .9 THEN ' Specialπ      star(cnt%).special = TRUEπ      star(cnt%).length = INT(RND * 10 + 15)π      star(cnt%).colr = 9 ' Color special blueπ      star(cnt%).speed = 15 ' Move it really fastπ    ELSE ' Normalπ      star(cnt%).length = 1π      star(cnt%).colr = INT(RND * 15 + 16)π      star(cnt%).speed = ((star(cnt%).colr - 15) / 5) + 1π    END IFπ  END IFπ  tx1% = INT(star(cnt%).radius * CosLook(star(cnt%).degree)) + 159π  ty1% = INT(star(cnt%).radius * SinLook(star(cnt%).degree)) + 99π  tx2% = INT((star(cnt%).radius + star(cnt%).length) * CosLook(star(cnt%).degree)) + 159π  ty2% = INT((star(cnt%).radius + star(cnt%).length) * SinLook(star(cnt%).degree)) + 99π  LINE (tx1%, ty1%)-(tx2%, ty2%), star(cnt%).colr ' Erase starπNEXT cnt%πRETURNππDoWormhole:πCIRCLE (159, 99), wormholeradius1, 0 ' Erase old circlesπCIRCLE (159, 99), wormholeradius2, 0πwormholeradius1 = INT(RND * 6) ' Create new circleπwormholeradius2 = INT(RND * 6)πCIRCLE (159, 99), wormholeradius1, 9 ' Draw new circlesπCIRCLE (159, 99), wormholeradius2, 1πRETURNππMoveShip:πIF moving THENπ  ErasePolygon ship, ShipVert()π  posit% = posit% + moving * 3 ' Move shipπ  IF posit% < 0 THEN posit% = posit% + 360π  IF posit% > 360 THEN posit% = posit% - 360π  ship.lxo = INT(80 * CosLook(posit%)) + 159π  ship.lyo = INT(80 * SinLook(posit%)) + 99π  RotatePolygon ship, ShipVert(), moving * 3π  moving = 0πEND IFπDrawPolygon ship, ShipVert()πRETURNππDoBaddies:πToBeKilled% = 0πm% = 0πWHILE m% < NumMonstersπ  m% = m% + 1 ' Loop through, 1..NumMonstersπ  IF Monster(m%).dying THENπ    PUT (Monster(m%).x, Monster(m%).y), ExplodeGraph(1, Monster(m%).dying)π  ELSEπ    PUT (Monster(m%).x, Monster(m%).y), MonstGraph(1, Monster(m%).MonstType)π  END IFπ  IF Monster(m%).dying < 5 THEN ' If not at end of dyingπ    Monster(m%).radius = Monster(m%).radius + MonstSpeedπ    Monster(m%).x = INT(Monster(m%).radius * CosLook(Monster(m%).degree)) + 154π    Monster(m%).y = INT(Monster(m%).radius * SinLook(Monster(m%).degree)) + 94π    IF Monster(m%).dying THENπ      Monster(m%).dying = Monster(m%).dying + 1π      PUT (Monster(m%).x, Monster(m%).y), ExplodeGraph(1, Monster(m%).dying), PSETπ    ELSEπ      PUT (Monster(m%).x, Monster(m%).y), MonstGraph(1, Monster(m%).MonstType), PSETπ    END IFπ    IF Monster(m%).radius > 90 THEN ' Outside orbitπ      IF Monster(m%).MonstType = 2 THEN ' Good guyπ        score = score + 250π        LINE (Monster(m%).x - 3, Monster(m%).y - 3)-(Monster(m%).x + 13, Monster(m%).y + 13), 0, BFπ        GOSUB KillMonsterπ      ELSE ' Baddie, you lose!π        quit = 2π      END IFπ    END IFπ  ELSE ' At end of dyingπ    ToBeKilled% = m%π  END IFπWENDπIF ToBeKilled% > 0 THENπ  m% = ToBeKilled%π  ' Erase out last vestiges of monster graphicπ  LINE (Monster(m%).x - 3, Monster(m%).y - 3)-(Monster(m%).x + 13, Monster(m%).y + 13), 0, BFπ  GOSUB KillMonsterπEND IFπIF NOT beginning THENπ  IF RND > MonstChance THEN ' Create new monster occasionallyπ    IF NumMonsters < TOT.MONSTERS - 2 THEN ' If there's spaceπ      GOSUB CreateMonsterπ    END IFπ  END IFπEND IFπRETURNππDoMissiles:πmiss% = 0πWHILE miss% < NumMissilesπ  miss% = miss% + 1 ' Loop through, 1..NumMissilesπ  ' Erase missileπ  LINE (Missile(miss%).x1%, Missile(miss%).y1%)-(Missile(miss%).x2%, Missile(miss%).y2%), 0π  IF Missile(miss%).radius = 0 THEN ' If at centerπ    GOSUB KillMissileπ  ELSEπ    Missile(miss%).radius = Missile(miss%).radius - 3 ' Move its coordinatesπ    Missile(miss%).x1 = INT(Missile(miss%).radius * CosLook(Missile(miss%).angle)) + 159π    Missile(miss%).y1 = INT(Missile(miss%).radius * SinLook(Missile(miss%).angle)) + 99π    Missile(miss%).x2 = INT((Missile(miss%).radius + 3) * CosLook(Missile(miss%).angle)) + 159π    Missile(miss%).y2 = INT((Missile(miss%).radius + 3) * SinLook(Missile(miss%).angle)) + 99π    IF POINT(Missile(miss%).x1%, Missile(miss%).y1%) >= 100 THENπ      cnt% = 0 ' Hit a monster! (front end)π      WHILE cnt% < NumMonsters AND Monster(cnt%).dying = 0π        cnt% = cnt% + 1 ' Find hit monsterπ        IF Missile(miss%).x1% >= Monster(cnt%).x THENπ          IF Missile(miss%).y1% >= Monster(cnt%).y THENπ            IF Missile(miss%).x1% <= Monster(cnt%).x + 10 THENπ              IF Missile(miss%).y1% <= Monster(cnt%).y + 10 THENπ                Monster(cnt%).dying = 1π              END IFπ            END IFπ          END IFπ        END IFπ      WENDπ      GOSUB KillMissileπ    ELSEIF POINT(Missile(miss%).x2%, Missile(miss%).y2%) >= 100 THENπ      cnt% = 0 ' Hit a monster! (back end)π      WHILE cnt% < NumMonsters AND Monster(cnt%).dying = 0π        cnt% = cnt% + 1 ' Find hit monsterπ        IF Missile(miss%).x2% >= Monster(cnt%).x THENπ          IF Missile(miss%).y2% >= Monster(cnt%).y THENπ            IF Missile(miss%).x2% <= Monster(cnt%).x + 10 THENπ              IF Missile(miss%).y2% <= Monster(cnt%).y + 10 THENπ                Monster(cnt%).dying = 1π              END IFπ            END IFπ          END IFπ        END IFπ      WENDπ      GOSUB KillMissileπ    ELSE ' Draw Missileπ      LINE (Missile(miss%).x1%, Missile(miss%).y1%)-(Missile(miss%).x2%, Missile(miss%).y2%), 14π    END IFπ  END IFπWENDπRETURNππFire:πIF TIMER > LastMissile! + .7 OR NumMissiles = 0 THENπ  ' If time has passed or there are no active missilesπ  IF NumMissiles < 10 THEN ' If enough missiles leftπ    NumMissiles = NumMissiles + 1π    Missile(NumMissiles).radius = 78 ' Put near shipπ    Missile(NumMissiles).angle = posit% ' Missile Angle = Ship Angleπ    score = score - 5π    IF score < 0 THEN score = 0π    LastMissile! = TIMERπ  END IFπEND IFπRETURNππCreateMonster:πNumMonsters = NumMonsters + 1 ' Another monsterπMonster(NumMonsters).x = 154 ' First coordinatesπMonster(NumMonsters).y = 94πMonster(NumMonsters).degree = INT(RND * 361)πMonster(NumMonsters).radius = 0 ' In the middleπMonster(NumMonsters).exist = TRUEπIF RND > .95 THEN ' Good guy 5% of timeπ  Monster(NumMonsters).MonstType = 2πELSE ' Bad guy 95% of timeπ  Monster(NumMonsters).MonstType = 1πEND IFπPUT (Monster(NumMonsters).x, Monster(NumMonsters).y), MonstGraph(1, Monster(NumMonsters).MonstType), PSETπRETURNππKillMonster:πIF Monster(m%).MonstType = 1 THENπ  ' Further in, higher scoreπ  score = score + (100 - Monster(m%).radius)π  MonstersKilled% = MonstersKilled% + 1π  IF MonstersKilled% MOD 15 = 0 THENπ    MonstChance = MonstChance - .005π  END IFπ  IF MonstersKilled% MOD 20 = 0 THENπ    MonstSpeed = MonstSpeed + .05π  END IFπELSEπ  score = score - 100π  IF score < 0 THEN score = 0πEND IFπFOR cnt1% = m% TO NumMonsters ' Copy next over currentπ  Monster(cnt1%).x = Monster(cnt1% + 1).xπ  Monster(cnt1%).y = Monster(cnt1% + 1).yπ  Monster(cnt1%).degree = Monster(cnt1% + 1).degreeπ  Monster(cnt1%).radius = Monster(cnt1% + 1).radiusπ  Monster(cnt1%).dying = Monster(cnt1% + 1).dyingπ  Monster(cnt1%).exist = Monster(cnt1% + 1).existπ  Monster(cnt1%).MonstType = Monster(cnt1% + 1).MonstTypeπNEXT cnt1%πNumMonsters = NumMonsters - 1 ' One less monster!πRETURNππKillMissile:πFOR cnt1% = miss% TO NumMissiles ' Copy next over currentπ  Missile(cnt1%).x1 = Missile(cnt1% + 1).x1π  Missile(cnt1%).y1 = Missile(cnt1% + 1).y1π  Missile(cnt1%).x2 = Missile(cnt1% + 1).x2π  Missile(cnt1%).y2 = Missile(cnt1% + 1).y2π  Missile(cnt1%).angle = Missile(cnt1% + 1).angleπ  Missile(cnt1%).radius = Missile(cnt1% + 1).radiusπNEXT cnt1%πNumMissiles = NumMissiles - 1 ' One less missileπRETURNππDoScore:πIF NOT beginning THENπ  LOCATE 25, 1: PRINT score;π  LOCATE 25, 36: PRINT MonstersKilled%;πEND IFπRETURNππDoInput:πkp% = INP(&H60) ' Get keypress in kp%πIF kp% < 100 THEN ' &H60 is > 100 if no keypressesπ  IF kp% = 75 THEN ' [RIGHT]π    moving = 1π  ELSEIF kp% = 77 THEN ' [LEFT]π    moving = -1π  ELSEIF kp% = 57 THEN ' [SPACE]π    GOSUB Fireπ  ELSEIF kp% = 25 THEN ' [P]π    GOSUB Pauseπ  ELSEIF kp% = 28 THEN ' [ENTER]π    GoingUp = FALSEπ    Staying = 0π    ScoreColor% = 1π  ELSEIF kp% = 1 THEN ' [ESC]π    quit = 1π  END IFπEND IFπRETURNππPause:πIF NOT beginning THENπ  LOCATE 5, 18: PRINT "PAUSED";π  DO: LOOP UNTIL INKEY$ <> "" ' Wait for keypressπ  LOCATE 5, 18: PRINT "      ";πEND IFπRETURNππInit:πSCREEN 13πRANDOMIZE TIMERππCIRCLE (5, 5), 5, 100: PAINT (5, 5), 100 ' Draw monsterπLINE (0, 0)-(10, 10), 100πLINE (10, 0)-(0, 10), 100πLINE (4, 5)-(6, 5), 101πLINE (5, 4)-(5, 6), 101πPSET (0, 0), 101: PSET (10, 0), 101πPSET (0, 10), 101: PSET (10, 10), 101πGET (0, 0)-(10, 10), MonstGraph(1, 1)πPUT (0, 0), MonstGraph(1, 1)ππPUT (10, 10), MonstGraph(1, 1)πLINE (10, 15)-(20, 15), 0 ' Explosion 1πLINE (15, 10)-(16, 20), 0πLINE (14, 14)-(17, 16), 0, BπCIRCLE (15, 15), 3, 12, , , 1 / 3πPAINT (15, 15), 12πPSET (14, 13), 7πPSET (17, 17), 7πGET (8, 8)-(22, 22), ExplodeGraph(1, 1)ππCIRCLE (16, 15), 4, 0 ' Explosion 2πCIRCLE (15, 15), 4, 12, , , 1 / 2πCIRCLE (15, 15), 2, 14, , , 1 / 2πPAINT (15, 15), 14πCIRCLE (13, 12), 1, 7: PSET (13, 12), 7πCIRCLE (18, 18), 1, 7: PSET (18, 18), 7πGET (8, 8)-(22, 22), ExplodeGraph(1, 2)ππPUT (10, 10), MonstGraph(1, 1), PSET ' Explosion 3πCIRCLE (15, 15), 6, 0: PAINT (15, 15), 0πCIRCLE (15, 15), 6, 4, , , 1 / 2πPAINT (15, 15), 4πCIRCLE (15, 15), 4, 14, , , 1 / 2πPAINT (15, 15), 14πPSET (10, 10), 0πCIRCLE (12, 11), 1, 8πCIRCLE (19, 19), 1, 8πGET (8, 8)-(22, 22), ExplodeGraph(1, 3)πPUT (8, 8), ExplodeGraph(1, 3)ππCIRCLE (15, 15), 7, 116, , , 1 / 2 ' Explosion 4πPAINT (15, 15), 116πCIRCLE (15, 15), 4, 0, , , 1 / 2πPAINT (15, 15), 0πGET (8, 8)-(22, 22), ExplodeGraph(1, 4)πPUT (8, 8), ExplodeGraph(1, 4)ππCIRCLE (15, 15), 7, 43, , , 1 / 2 ' Explosion 5πGET (8, 8)-(22, 22), ExplodeGraph(1, 5)πPUT (8, 8), ExplodeGraph(1, 5)ππCIRCLE (15, 15), 5, 104, , , 1 / 3 ' Draw good guyπPAINT (15, 15), 104πCIRCLE (15, 15), 5, 104, , , 3πLINE (15, 10)-(15, 20), 104πLINE (10, 10)-(20, 20), 104πLINE (20, 10)-(10, 20), 104πGET (10, 10)-(20, 20), MonstGraph(1, 2)πPUT (10, 10), MonstGraph(1, 2)ππPALETTE 100, 30 ' Change monster color to redπPALETTE 104, 3942440 ' Change good guy color to bright blueππFOR cnt% = 0 TO 360 ' Initialise look-up tablesπ  SinLook(cnt%) = SIN(cnt% * DEG2RAD)π  CosLook(cnt%) = COS(cnt% * DEG2RAD)πNEXT cnt%ππposit% = 0 ' Player's initial position = 0πship.lxo = INT(80 * CosLook(posit%)) + 159πship.lyo = INT(80 * SinLook(posit%)) + 99πscore = 0πMonstersKilled% = 0πScoreColor% = 0πScoreMoving% = 1ππFOR cnt% = 1 TO TOT.STARS ' Initialise starsπ  star(cnt%).radius = INT(RND * 100)π  star(cnt%).degree = INT(RND * 361)π  IF RND > .9 THEN ' Specialπ    star(cnt%).special = TRUEπ    star(cnt%).length = INT(RND * 10 + 15)π    star(cnt%).colr = 9π    star(cnt%).speed = 15π  ELSE ' Normalπ    star(cnt%).length = 1π    star(cnt%).colr = INT(RND * 15 + 16)π    star(cnt%).speed = ((star(cnt%).colr - 15) / 5) + 1π  END IFπNEXT cnt%ππship.BorderColor = 53 ' Original ship color is light blueπship.filled = FALSE ' Ship is not filledπship.NumVertices = 11 ' 11 verticesπFOR cnt% = 1 TO ship.NumVertices ' Define verticesπ  READ ShipVert(cnt%).x, ShipVert(cnt%).yπNEXT cnt%ππMonstSpeed = .1πMonstChance = .97ππPALETTE 102, 0πCOLOR 102ππbeginning = TRUEπGoingUp = TRUEππDrawPolygon ship, ShipVert()ππRETURNππEndOfGame:πIF quit = 1 THENπ  SCREEN 0: WIDTH 80π  PRINT "Quitter!"πELSEIF quit = 2 THENπ  LOCATE 12, 16: PRINT "YOU LOSE";π  SLEEP 2 ' Pause for two secondsπ  done = FALSEπ  cnt% = 0π  WHILE cnt% < 2000 AND NOT doneπ    cnt% = cnt% + 1 ' Loop 3000 timesπ    XX% = INT(RND * 271)π    YX% = INT(RND * 150)π    GET (XX%, YX%)-(XX% + 48, YX% + 48), meltπ    PUT (XX%, YX% + 1), melt, PSETπ    ' End on keyhit only after melting awhileπ    IF INKEY$ <> "" THEN IF cnt% > 500 THEN done = TRUEπ    ' Do an occasional delayπ    IF cnt% MOD 100 = 0 THEN t! = TIMER: WHILE t! = TIMER: WENDπ  WENDπ  SCREEN 0: WIDTH 80 ' Normal text screenπEND IFπRETURNππDATA 0, 0πDATA 5, -5πDATA 10, -5πDATA 5, -10πDATA 10, -10πDATA 15, -5πDATA 15, 5πDATA 10, 10πDATA 5, 10πDATA 10, 5πDATA 5, 5ππSUB DrawPolygon (poly AS PolygonType, verts() AS VertexType)ππxo = poly.lxoπyo = poly.lyoππIF poly.filled THENπ  FOR index = 1 TO poly.NumVertices - 1π    LINE (xo + verts(index).x, yo + verts(index).y)-(xo + verts(index + 1).x, yo + verts(index + 1).y), poly.FilledColorπ  NEXT indexπ  LINE (xo + verts(poly.NumVertices).x, yo + verts(poly.NumVertices).y)-(xo + verts(1).x, yo + verts(1).y), poly.FilledColorπ  PAINT (xo, yo), poly.FilledColorπELSEπ  FOR index = 1 TO poly.NumVertices - 1π    LINE (xo + verts(index).x, yo + verts(index).y)-(xo + verts(index + 1).x, yo + verts(index + 1).y), poly.BorderColorπ  NEXT indexπ  LINE (xo + verts(poly.NumVertices).x, yo + verts(poly.NumVertices).y)-(xo + verts(1).x, yo + verts(1).y), poly.BorderColorπEND IFππEND SUBππSUB ErasePolygon (poly AS PolygonType, verts() AS VertexType)ππxo = poly.lxoπyo = poly.lyoππIF poly.filled THENπ  FOR index = 1 TO poly.NumVertices - 1π    LINE (xo + verts(index).x, yo + verts(index).y)-(xo + verts(index + 1).x, yo + verts(index + 1).y), 0π  NEXT indexπ  LINE (xo + verts(poly.NumVertices).x, yo + verts(poly.NumVertices).y)-(xo + verts(1).x, yo + verts(1).y), 0π  PAINT (xo, yo), FilledColorπELSEπ  FOR index = 1 TO poly.NumVertices - 1π    LINE (xo + verts(index).x, yo + verts(index).y)-(xo + verts(index + 1).x, yo + verts(index + 1).y), 0π  NEXT indexπ  LINE (xo + verts(poly.NumVertices).x, yo + verts(poly.NumVertices).y)-(xo + verts(1).x, yo + verts(1).y), 0πEND IFππEND SUBππSUB RotatePolygon (poly AS PolygonType, verts() AS VertexType, angle AS INTEGER)ππIF angle >= 0 THENπ  si = SIN(angle * DEG2RAD)π  cs = COS(angle * DEG2RAD)πELSEπ  si = SIN((angle + 360) * DEG2RAD)π  cs = COS((angle + 360) * DEG2RAD)πEND IFππFOR index = 1 TO poly.NumVerticesπ  rx = verts(index).x * cs - verts(index).y * siπ  ry = verts(index).y * cs + verts(index).x * siπ  verts(index).x = rxπ  verts(index).y = ryπNEXT indexππEND SUBπThe ABC Programmer             JEWEL - LIKE COLUMNS           Converted from Pascal code     10-20-96 (18:11)       QB, QBasic, PDS        498  14257    JEWEL.BAS   '********************************************************π'* WARNING: CODE BELOW CONTAINS VERY ADDICTIVE GAME PLAYπ'********************************************************π'*  JEWEL (ASCII Version) - Like Columns for Sega(tm)π'*   100% Public Domain - all rights relinquishedπ'*   Colour/Monochrome compatible!π'*π'*  This version has been 95% ported from Turbo Pascalπ'*    code to BASIC by William Yu  (10-20-96)π'*  Minor alterations/optimization routines have beenπ'*    implemented.  Game has been ported AS IS.π'*    Not responsible for misinterpreted translation.π'*π'*  Original code for XWindows - Author Unknownπ'*  Original code for TP - Jurgen Prins (???)π'*π'*  Turbo Pascal code can be found at (as of 10/96):π'*    http://www.cs.vu.nl/~jprins/ftp/src/jewel.zipπ'*π'* Instructions for gameplay (as written):π'*π'*  Try to get three same colors in an horizontal,π'*  vertical or diagonal row. Switch colors with Up,π'*  move with Left & Right, force placementπ'*  with Down. P is pause, Esc is quit.π'*π'* Notice: (as discovered)π'*π'*  The "clear all" jewel will clear all jews ofπ'*  ONE colour.  So if the "clear all" jewel landsπ'*  on the colour red, it would clear all red jewels.π'*       π'********************************************************πDEFINT A-ZπDECLARE FUNCTION RandomColor% ()πDECLARE SUB InitField ()πDECLARE SUB InitVars ()πDECLARE SUB InitScreen ()πDECLARE SUB RefreshScreen ()πDECLARE FUNCTION GenerateNewBlock% ()πDECLARE FUNCTION MoveBlockDown% (col%, startRow%, endRow%, checkflag%)πDECLARE SUB SwapBlockColors ()πDECLARE SUB ForceBlockDown ()πDECLARE SUB MoveBlockLeft ()πDECLARE SUB MoveBlockRight ()πDECLARE SUB GetKeyboardEvent ()πDECLARE FUNCTION MatchesFound% ()πDECLARE SUB WriteLives ()πDECLARE SUB WriteScore ()ππSCREEN 0, 0, 0, 0ππCONST JewelChr = ""πCONST JewelChance = 20       ' Chance of receiving the "clear all" jewelπCONST MatchBackGround = 0πCONST MatchForeGround = 31πCONST False = 0πCONST True = NOT FalseπCONST Mono = False           ' <--- Playable even with monochrome display!π                             ' Change to TRUE if you don't have color.πCONST BigScreen = True       ' For WIDTH 40, 25 or for graphics modeππDIM SHARED Well(0 TO 31, 0 TO 22) AS INTEGERππDIM SHARED Colors, Rows, Cols, LeftX, RightX, TopY, BotYπDIM SHARED BlockCol, BlockEndRow, SpeedDelay!, Lives, LevelπDIM SHARED IncreaseSpeed!, ScoreObtainedπDIM SHARED AchievedScore AS LONGπDIM SHARED Score AS LONGπDIM SHARED Pause, Escapeππ'********************************π'   Initialize variablesπ'********************************ππ    IF BigScreen THEN WIDTH 40, 25ππ    SpeedDelay! = .5       ' Delay in secondsπ    IncreaseSpeed! = .025  ' Increase speed for each ScoreObtainedπ    ScoreObtained = 2500   ' Speed increases with every 2500 points obtainedπ    AchievedScore = ScoreObtainedππ    Level = 100       ' Levels have not been implemented, this affects scoreπ    Cols = 6          ' Max of 30 depending on WIDTHπ    Rows = 20         ' Max of 22π    Colors = 5        ' Number of color gems used, Max of 10π    Score = 0         ' Starting scoreπ    Lives = 3         ' How many lives remainingππ'*********************************ππ    InitScreenπ    WHILE (Lives > 0)π        InitFieldπ        WriteLivesπ        RefreshScreenπ        WHILE (GenerateNewBlock) AND (NOT Escape)π            RefreshScreenπ            WHILE MoveBlockDown(BlockCol, BlockEndRow - 2, BlockEndRow, True) AND (NOT Escape)π                BlockEndRow = BlockEndRow + 1π                RefreshScreenπ                T! = TIMERπ                DOπ                    GetKeyboardEventπ                LOOP UNTIL TIMER - T! >= SpeedDelay! AND (NOT Pause)π            WENDπ            DOπ            LOOP UNTIL NOT MatchesFoundπ        WENDπ        Lives = Lives - 1π        SpeedDelay! = .5π    WENDπ    WriteScoreππENDππSUB ForceBlockDownππ    WHILE MoveBlockDown(BlockCol, BlockEndRow - 2, BlockEndRow, True)π        BlockEndRow = BlockEndRow + 1π    WENDππEND SUBππFUNCTION GenerateNewBlockππ    RANDOMIZE TIMERπ    midCol = (Cols / 2) + 1π    IF Well(midCol, 3) <> 0 THENπ      GenerateNewBlock = Falseπ    ELSEπ        IF INT(RND * JewelChance) = 0 THENπ            FOR I = 1 TO 3π              Well(midCol, I) = 24π            NEXT Iπ        ELSEπ            FOR I = 1 TO 3π              Well(midCol, I) = RandomColorπ            NEXT Iπ        END IFπ        GenerateNewBlock = Trueπ    END IFπ    BlockCol = midColπ    BlockEndRow = 3ππEND FUNCTIONππSUB GetKeyboardEventππ  Ch$ = INKEY$π  IF LEN(Ch$) THENπ      IF LEN(Ch$) = 2 THEN Ch = -(ASC(RIGHT$(Ch$, 1))) ELSE Ch = ASC(UCASE$(Ch$))π      SELECT CASE Chπ        CASE -72π          SwapBlockColorsπ          RefreshScreenπ        CASE -80π          ForceBlockDownπ          RefreshScreenπ        CASE -75π          MoveBlockLeftπ          RefreshScreenπ        CASE -77π          MoveBlockRightπ          RefreshScreenπ        CASE 27π          Escape = Trueπ        CASE 80π          Pause = NOT Pauseπ      END SELECTπ  END IFππEND SUBππSUB InitFieldππ    FOR row = 1 TO Rowsπ        FOR col = 1 TO Colsπ            Well(col, row) = 0π        NEXT colπ    NEXT rowππEND SUBππSUB InitScreenππ    COLOR 6π    IF BigScreen THEN MidPoint = 20 ELSE MidPoint = 40ππ    TopY = ((25 - Rows) / 2)π    BotY = TopY + Rows - 1π    LeftX = MidPoint - Colsπ    RightX = MidPoint - 1 + Colsππ    LOCATE TopY - 1, LeftXπ    PRINT STRING$(Cols * 2 + 1, CHR$(196));ππ    LOCATE BotY + 1, LeftXπ    PRINT STRING$(Cols * 2 + 1, CHR$(196));π   π    FOR y = TopY - 1 TO BotY + 1π        LOCATE y, LeftX - 1π        PRINT CHR$(179);π        LOCATE y, RightX + 1π        PRINT CHR$(179);π    NEXT yπ    LOCATE TopY - 1, MidPoint - 1 - Colsπ    PRINT CHR$(218);π    LOCATE TopY - 1, MidPoint + Colsπ    PRINT CHR$(191);π    LOCATE BotY + 1, MidPoint - 1 - Colsπ    PRINT CHR$(192);π    LOCATE BotY + 1, MidPoint + Colsπ    PRINT CHR$(217);ππEND SUBππSUB InitVarsππ' Moved to main programππEND SUBππFUNCTION MatchesFoundππDIM MatchField(0 TO 31, 0 TO 22)  AS INTEGERππ    Found = Falseππ    '(* initialize the Matchfield *)π    FOR J = 1 TO Rowsπ        FOR I = 1 TO Colsπ            MatchField(I, J) = MatchBackGroundπ        NEXT Iπ    NEXT Jππ    IF Well(BlockCol, BlockEndRow) = 24 THEN  '(* we have a jewel here! *)π        IF BlockEndRow < Rows THENπ            Colour = Well(BlockCol, BlockEndRow + 1)π            FOR J = 1 TO Rowsπ                FOR I = 1 TO Colsπ                    IF (Well(I, J) = Colour) OR (Well(I, J) = 24) THEN MatchField(I, J) = MatchForeGroundπ                NEXT Iπ            NEXT Jπ        ELSEπ            FOR BlockRow = BlockEndRow TO BlockEndRow - 2 STEP -1π                MatchField(BlockCol, BlockRow) = MatchForeGroundπ            NEXT BlockRowπ        END IFπ        Found = Trueπ    ELSEπ        FOR BlockRow = BlockEndRow TO BlockEndRow - 2 STEP -1π            Colour = Well(BlockCol, BlockRow)ππ            '(* Look for vertical matches, first downwards, then upwards *)π            J = BlockRow + 1π            WHILE ((J <= Rows) AND (Well(BlockCol, J) = Colour))π                J = J + 1π            WENDπ            J = J - 1π            Endmatch = Jπ            WHILE ((J >= 1) AND (Well(BlockCol, J) = Colour))π                J = J - 1π            WENDπ            Startmatch = J + 1π            IF (Endmatch - Startmatch > 1) AND (Colour <> 0) THENπ                FOR J = Startmatch TO Endmatchπ                    MatchField(BlockCol, J) = MatchForeGroundπ                NEXT Jπ                Found = Trueπ            END IFππ            '(* Look for horizontal matches, first rightwards, then to the left*)π            I = BlockCol + 1π            WHILE ((I <= Cols) AND (Well(I, BlockRow) = Colour))π                I = I + 1π            WENDπ            I = I - 1π            Endmatch = Iπ            WHILE ((I >= 1) AND (Well(I, BlockRow) = Colour))π                I = I - 1π            WENDπ            Startmatch = I + 1π            IF (Endmatch - Startmatch > 1) AND (Colour <> 0) THENπ                FOR I = Startmatch TO Endmatchπ                    MatchField(I, BlockRow) = MatchForeGroundπ                NEXT Iπ                Found = Trueπ            END IFππ            '(* look for diagonal matches, first rightdownwards, then leftup *)π            J = BlockRow + 1π                I = BlockCol + 1π            WHILE ((J <= Rows) AND (I <= Cols) AND (Well(I, J) = Colour))π                I = I + 1π                J = J + 1π            WENDπ            I = I - 1π            J = J - 1π            Endmatch = Iπ            WHILE ((J >= 1) AND (I >= 1) AND (Well(I, J) = Colour))π                I = I - 1π                J = J - 1π            WENDπ                Startmatch = I + 1π            IF (Endmatch - Startmatch > 1) AND (Colour <> 0) THENπ                FOR I = Startmatch TO Endmatchπ                    MatchField(I, I - (BlockCol - BlockRow)) = MatchForeGroundπ                NEXT Iπ                Found = Trueπ            END IFππ            '(* look for diagonal matches, first leftdownwards, then rightup *)π            J = BlockRow + 1π            I = BlockCol - 1π            WHILE ((J <= Rows) AND (I >= 1) AND (Well(I, J) = Colour))π                I = I - 1π                J = J + 1π            WENDπ            I = I + 1π            J = J - 1π            Endmatch = Iπ            WHILE ((J >= 1) AND (I <= Cols) AND (Well(I, J) = Colour))π                I = I + 1π                J = J - 1π            WENDπ            Startmatch = I - 1π            IF (Startmatch - Endmatch > 1) AND (Colour <> 0) THENπ                FOR I = Startmatch TO Endmatch STEP -1π                    MatchField(I, (BlockCol + BlockRow) - I) = MatchForeGroundπ                NEXT Iπ                Found = Trueπ            END IFπ        NEXT BlockRowππ    END IFππ    '(* handle the first row (there are no blocks above to move down) *)π    FOR I = 1 TO Colsπ        IF MatchField(I, 1) = MatchForeGround THEN Well(I, 1) = 0π    NEXT Iππ    '(* scan Matchfield and move at each encounter upper blocks down *)π    FOR J = 2 TO Rowsπ        FOR I = 1 TO Colsπ            IF MatchField(I, J) = MatchForeGround THENπ                MV = MoveBlockDown(I, 1, J - 1, False)π                'ForceBlockDownπ                IF (I = BlockCol) AND (BlockEndRow < Rows) THEN BlockEndRow = BlockEndRow + 1π                RefreshScreenπ                Score = Score + (10000 / Level)π                IF (Score > AchievedScore) THENπ                  AchievedScore = AchievedScore + ScoreObtainedπ                  IF (SpeedDelay! > .1) THEN SpeedDelay! = SpeedDelay! - IncreaseSpeed!π                END IFπ            END IFπ        NEXT Iπ    NEXT Jππ    MatchesFound = FoundππEND FUNCTIONππFUNCTION MoveBlockDown (col, startRow, endRow, checkflag)π   π    IF endRow = Rows THENπ        MoveBlockDown = Falseπ    ELSEπ        IF checkflag AND (Well(col, endRow + 1) <> 0) THENπ            MoveBlockDown = Falseπ        ELSEπ            FOR I = endRow + 1 TO startRow + 1 STEP -1π                Well(col, I) = Well(col, I - 1)π            NEXT Iπ            Well(col, startRow) = 0π            MoveBlockDown = Trueπ        END IFπ    END IFππEND FUNCTIONππSUB MoveBlockLeftππ    IF BlockCol > 1 THENπ        IF (Well(BlockCol - 1, BlockEndRow) = 0) AND (Well(BlockCol - 1, BlockEndRow - 1) = 0) AND (Well(BlockCol - 1, BlockEndRow - 2) = 0) THENπ            BlockCol = BlockCol - 1π            FOR I = BlockEndRow - 2 TO BlockEndRowπ                Well(BlockCol, I) = Well(BlockCol + 1, I)π                Well(BlockCol + 1, I) = 0π            NEXT Iπ        END IFπ    END IFππEND SUBππSUB MoveBlockRightππ    IF BlockCol < Cols THENπ        IF (Well(BlockCol + 1, BlockEndRow) = 0) AND (Well(BlockCol + 1, BlockEndRow - 1) = 0) AND (Well(BlockCol + 1, BlockEndRow - 2) = 0) THENπ            BlockCol = BlockCol + 1π            FOR I = BlockEndRow - 2 TO BlockEndRowπ                Well(BlockCol, I) = Well(BlockCol - 1, I)π                Well(BlockCol - 1, I) = 0π            NEXT Iπ        END IFπ    END IFππEND SUBππFUNCTION RandomColorππ    RANDOMIZE TIMERπ    SELECT CASE INT(RND * Colors)π        CASE 0π          RandomColor = 1π        CASE 1π          RandomColor = 2π        CASE 2π          RandomColor = 4π        CASE 3π          RandomColor = 7π        CASE 4π          RandomColor = 14π        CASE 5π          RandomColor = 11π        CASE 6π          RandomColor = 13π        CASE 7π          RandomColor = 9π        CASE 8π          RandomColor = 12π        CASE 9π          RandomColor = 15π    END SELECTππEND FUNCTIONππSUB RefreshScreenππ    row = 1π    col = 1π    x = LeftXπ    y = TopYπ    WHILE (y <= BotY)π        WHILE (x < RightX)π            LOCATE y, xπ            IF NOT Mono THENπ              COLOR Well(col, row)π              PRINT JewelChr;π            ELSEπ              IF Well(col, row) = 0 THENπ                PRINT "  "π              ELSEπ                  PRINT CHR$(Well(col, row) + 64);π              END IFπ            END IFπ            x = x + 2π            col = col + 1π        WENDπ        y = y + 1π        row = row + 1π        x = LeftXπ        col = 1π    WENDπ    COLOR 5π    LOCATE TopY - 1, LeftX + 1π    PRINT Score;ππEND SUBππSUB SwapBlockColorsππ    I = Well(BlockCol, BlockEndRow - 2)π    Well(BlockCol, BlockEndRow - 2) = Well(BlockCol, BlockEndRow - 1)π    Well(BlockCol, BlockEndRow - 1) = Well(BlockCol, BlockEndRow)π    Well(BlockCol, BlockEndRow) = IππEND SUBππSUB WriteLivesππ    COLOR 5π    LOCATE TopY - 1, RightX - 1π    PRINT Lives;ππEND SUBππSUB WriteScoreππ    WIDTH 80π    COLOR 7π    PRINT "Jewel for DOS - Converted from Pascal code to BASIC by William Yu (10/96)"π    COLOR 2π    PRINT "Total score : "; Scoreπ    COLOR 7π    PRINTππEND SUBπLuke Molnar                    GORAU SHADED POLYGONS          Blood225@aol.com               09-01-96 (14:51)       QB, QBasic, PDS        261  5879     GORAU.BAS   π' Gorau Shaded Polygons.  Written by Luke Molnar.  A Molnar \ Kucalabaπ' Productions program.  Tons of concept and execution help provided byπ' David Eichorn.  If you are one of those people that need really obviousπ' things pointed out, this is REALLY SLOW!  I don't think many people inπ' their right mind would try to write a Gorau routine in QBasic and demandπ' that it be fast enough for animation, but this is pretty nice lookingπ' if I do say so myself. :-)πππ' Another QBasic graphics "demo" that appeared first at :ππ' WWW : http://members.aol.com/mkwebsite/index.htmlπ' FTP : ftp://users.aol.com/blood225/ππππDECLARE SUB GorauFill (Points() AS ANY)πDECLARE SUB Delay (Seconds!)πDECLARE SUB ChangeColors ()πDECLARE FUNCTION ValidPolPoints! ()πππ'$DYNAMICπRANDOMIZE TIMERππCLSπSCREEN 13πππTYPE GorTypeπ Y1 AS INTEGERπ Y2 AS INTEGERπ C1 AS INTEGERπ C2 AS INTEGERπEND TYPEππTYPE RoutineTypeπ X AS INTEGERπ Y AS INTEGERπ C AS INTEGERπEND TYPEππππDIM SHARED PolPoints(0 TO 3) AS RoutineTypeπππCOLOR 230ππDOπ π     ThisShouldBeASub% = ValidPolPoints ' Generate decent polygon pointsππ     ChangeColors                       ' Randomly assign a color schemeππ     GorauFill PolPoints()              ' Fill the 4 point polygonπ π     Delay 1                            ' Give user time to admire the beauty                         ππ  User$ = INKEY$                        ' Store any keypresses  ππ  CLS                                   ' Clear the screenππLOOP UNTIL User$ <> ""                  ' Keep going until they press a keyππCLSπSCREEN 0πWIDTH 80πSYSTEMππREM $STATICπSUB ChangeColorsππ' Changes the palette to one of 6 possible color variationsππDifColors% = INT(RND * 6) + 1ππFOR X% = 1 TO 230ππ OUT &H3C8, X%ππ  SELECT CASE DifColors%π   CASE 1: OUT &H3C9, EasyVal!: OUT &H3C9, 0: OUT &H3C9, 0π   CASE 2: OUT &H3C9, 0: OUT &H3C9, EasyVal!: OUT &H3C9, 0π   CASE 3: OUT &H3C9, 0: OUT &H3C9, 0: OUT &H3C9, EasyVal!π   CASE 4: OUT &H3C9, EasyVal!: OUT &H3C9, EasyVal!: OUT &H3C9, EasyVal!π   CASE 5: OUT &H3C9, EasyVal!: OUT &H3C9, EasyVal!: OUT &H3C9, 0π   CASE 6: OUT &H3C9, EasyVal!: OUT &H3C9, 0: OUT &H3C9, EasyVal!π  END SELECTππ EasyVal! = EasyVal! + .273913ππNEXTππEND SUBππSUB Delay (Seconds!)πFuture! = TIMER + Seconds!πDOπLOOP UNTIL TIMER >= Future! OR TIMER - (TIMER - Seconds!) < 0πEND SUBππSUB GorauFill (Points() AS RoutineType)ππDIM Scan(0 TO 320) AS GorTypeππXMax% = -32767πXmin% = 32767ππFOR X% = 0 TO 3π  IF XMax% < Points(X%).X THEN XMax% = Points(X%).Xπ  IF Xmin% > Points(X%).X THEN Xmin% = Points(X%).Xπ  PSET (Points(X%).X, Points(X%).Y), 230πNEXTπππ IF Xmin% < 0 THEN Xmin% = 0π IF XMax% > 320 THEN XMax% = 320π IF Xmin% > 320 THEN EXIT SUBπ IF XMax% < 0 THEN EXIT SUBππFOR X% = Xmin% TO XMax%π  Scan(X%).Y1 = -32767πNEXTππππFOR X% = 0 TO 3ππ  Val1% = X%π  Val2% = (X% + 1) MOD 4ππ    IF Points(Val1%).X > Points(Val2%).X THENπ      SWAP Val1%, Val2%π    END IFπ π  Y1% = Points(Val1%).Yπ  x1% = Points(Val1%).Xπ  Col1% = Points(Val1%).Cππ  Y2% = Points(Val2%).Yπ  x2% = Points(Val2%).Xπ  Col2% = Points(Val2%).Cππ  YDelta% = Y2% - Y1%π π  XDelta% = x2% - x1%π  CDelta% = Col2% - Col1%π π  IF XDelta% <> 0 THENπ   YSlope! = YDelta% / XDelta%π   CSlope! = CDelta% / XDelta%π  ELSEπ   YSlope% = 0π   CSlope% = 0π  END IFππ  YVal! = Y1%π  CVal! = Col1%π π      FOR I% = x1% TO x2%π       π        IF Scan(I%).Y1 = -32767 THENπ          Scan(I%).Y1 = YVal!π          Scan(I%).C1 = CVal!π        ELSEπ          Scan(I%).Y2 = YVal!π          Scan(I%).C2 = CVal!π        END IFππ        YVal! = YVal! + YSlope!π        CVal! = CVal! + CSlope!π     π      NEXTππNEXTππππFOR X% = Xmin% TO XMax%ππ  IF Scan(X%).Y1 > Scan(X%).Y2 THENπ    Y2% = Scan(X%).Y1π    Y1% = Scan(X%).Y2π    Col2% = Scan(X%).C1π    Col1% = Scan(X%).C2π  ELSEπ    Y2% = Scan(X%).Y2π    Y1% = Scan(X%).Y1π    Col2% = Scan(X%).C2π    Col1% = Scan(X%).C1π  END IFππ  YDelta% = Y2% - Y1%π π  IF YDelta% = 0 THEN YDelta% = 1ππ  CDelta% = Col2% - Col1%π  CSlope! = CDelta% / YDelta%π  CVal! = Col1%ππ    FOR I% = Scan(X%).Y1 TO Scan(X%).Y2π      PSET (X%, I%), CVal!π      CVal! = CVal! + CSlope!π    NEXTππNEXTππππEND SUBππFUNCTION ValidPolPointsππ' There are certain occurences with this routine in which the polygon willπ' not be correctly filled in.  This routine prevents those polygons fromπ' happening.ππFOR I% = 0 TO 3π π  SELECT CASE I%π    CASE 0:π           PolPoints(0).X = INT(RND * 60) + 1π           PolPoints(0).Y = INT(RND * 60) + 1π    CASE 1:π           PolPoints(1).X = INT(RND * 160) + 160π           PolPoints(1).Y = INT(RND * 100) + 2π'           IF PolPoints(1).Y < PolPoints(0).Y THEN PolPoints(1).Y = PolPoints(0).Y + INT(RND * (100 - PolPoints(0).Y))π    CASE 2:π           PolPoints(2).X = INT(RND * 160) + 160π'           IF PolPoints(2).X < PolPoints(1).X THEN PolPoints(2).X = PolPoints(1).X + 1π           PolPoints(2).Y = INT(RND * 50) + 150π    CASE 3:π           PolPoints(3).X = INT(RND * 160) + 1π           IF PolPoints(3).X < PolPoints(0).X THEN PolPoints(3).X = PolPoints(0).X + INT(RND * (160 - PolPoints(0).X))π           PolPoints(3).Y = INT(RND * 100) + 100π'           IF PolPoints(3).Y < PolPoints(2).Y THEN PolPoints(3).Y = PolPoints(2).Y + INT(RND * (100 - PolPoints(2).Y))π  END SELECTππ PolPoints(I%).C = -1ππNEXTππ π' Make one corner black and one corner the brightest color; the other 2 randomπ  π   DO UNTIL BlackOne% <> BrightOne%π     BlackOne% = INT(RND * 3)π     BrightOne% = INT(RND * 3)π   LOOPππ  PolPoints(BlackOne%).C = 0π  PolPoints(BrightOne%).C = 230ππ  FOR I% = 0 TO 3π   IF PolPoints(I%).C = -1 THEN PolPoints(I%).C = INT(RND * 230) + 1π  NEXTππEND FUNCTIONππJonathan Leger                 FAST 320X200X256 PCX VIEWER    leger@mail.dtx.net             09-02-96 (10:10)       QB, QBasic, PDS        152  5773     PCX.BAS     '***** PCX.BAS *****************************************************π'*** The original code for this routine was found in VGAPCX.BAS  ***π'*** At first I optomized the code in that file, and eventually  ***π'*** I ended up re-writing the whole thing.  That PCX loader did ***π'*** a number of things differently, including loading the color ***π'*** palette _last_.  This routine loads the palette first,  so  ***π'*** you can see the "correct" picture as the PCX is loading. In ***π'*** addition to that, I use all integers for speed and load the ***π'*** file in chunks of 2,000 bytes (instead of 1 byte at a time, ***π'*** as in the other routine, VGAPCX.BAS).  I thank the uknown   ***π'*** author of that original version, VGAPCX.BAS, because if he  ***π'*** had not put out that sample code, this PCX loader would not ***π'*** be possible.                                                ***π'*******************************************************************π'*** On a 486dx2-66, the old version (VGAPCX.BAS) loaded the PCX ***π'*** in about 21 seconds.  This new version does so in about 1.5 ***π'*** seconds.  The  speed varies depending on the  level of file ***π'*** compression attained by the PCX file.                       ***π'*******************************************************************πDEFINT A-ZππDECLARE SUB ShowPCX (file$)ππ'*** If you're using Qbasic 1.1, change this line toπ'*** ShowPCX "<pcxfile>.pcx"πShowPCX COMMAND$ππWHILE INKEY$ = "": WENDπSCREEN 0: WIDTH 80ππ'*** Loads a Version 5, 320x200x256c PCX file.π'*** If you have any questions or comments about any of this code,π'*** please contact me, Jonathan Leger, at leger@mail.dtx.net.πSUB ShowPCX (file$)ππSCREEN 13ππDIM pcxpal AS STRING * 768, pcxversion AS STRING * 1ππpcxnum = FREEFILEπOPEN file$ FOR BINARY AS #pcxnumππ   '*** Get the PCX version from the header.π   GET #pcxnum, 2, pcxversionππ   '*** If we're using version 5, then load the palette.π   IF ASC(pcxversion) = 5 THENπ      '*** Grab the palette out of the file.π      GET #1, LOF(pcxnum) - 767, pcxpalππ      '*** Start with color 0.π      pal = 0ππ      '*** Grab the red/green/blue value from our palette (PCXPAL) andπ      '*** send them to the monitor using OUT.π      FOR p = 1 TO 768 STEP 3π         OUT &H3C8, palπ         red% = INT(ASC(MID$(pcxpal, p, 1)) / 4)π         OUT &H3C9, red%π         green% = INT(ASC(MID$(pcxpal, p + 1, 1)) / 4)π         OUT &H3C9, green%π         blue% = INT(ASC(MID$(pcxpal, p + 2, 1)) / 4)π         OUT &H3C9, blue%π         pal = pal + 1π      NEXT pππ   END IFπ  π   '*** Jump past the file header.π   SEEK #pcxnum, 129ππ   '*** We'll be sending the output the the screen, so our segmentπ   '*** is &HA000 (VGA screen memory) and our offset is 0.  You canπ   '*** change these values to, say, decompress the image into anπ   '*** array or something.π   fxoffset = 0: fxsegment = &HA000ππ   '*** We'll be reading chunks of 2,000 bytes.  You can increase orπ   '*** decrease this depending on your needs.  I noticed little orπ   '*** no difference when the chunk size went past 2,000, so I leftπ   '*** it at 2,000 to add as little over-head as possible with maximumπ   '*** speed.π   datasize = 2000ππ   '*** Load our first chunk of data and point to the beginning of thatπ   '*** data.π   pcxdata$ = INPUT$(datasize, pcxnum)π   datacount = 1ππ   '*** To increase speed, we'll be drawing the screen in two loops,π   '*** that way we can use integers to point to the next pixel insteadπ   '*** of long integers.  Doing this gains tremendous speed.π   FOR half = 1 TO 2ππ      '*** On the second loop, this will add &H7D0 (32000) to ourπ      '*** segment so we'll be writing to the second half of the screen.π      '*** On the first loop, this will simply set our segment to &HA000.π      fxtotal = fxsegment + fxoffsetπ      DEF SEG = fxtotalππ      FOR c = 0 TO 31999ππ         '*** If we're out of data, then we need to load the next chunk.π         IF datacount > datasize THENπ            pcxdata$ = INPUT$(datasize, pcxnum)π            datacount = 1π         END IFππ         '*** Get the next byte from our data chunk.π         clr = ASC(MID$(pcxdata$, datacount, 1))π         datacount = datacount + 1ππ         '*** If we're out of data, then we load the next chunk.π         IF datacount > datasize THENπ            pcxdata$ = INPUT$(datasize, pcxnum)π            datacount = 1π         END IFπ        π         '*** If the byte we pulled from the data has bit 6 and 7 set,π         '*** (which would make the value greater than 192), then thatπ         '*** means we'll be repeating a color.  So we pull the nextπ         '*** byte from our data chunk (which is the color), and putπ         '*** it on the screen CLR - 192 times (in other words, weπ         '*** take the value of the first 5 bits in the byte and putπ         '*** the pixel to the screen that many times.)π         IF clr > 192 THENπ            LPS = clr - 192π            clr = ASC(MID$(pcxdata$, datacount, 1))π            datacount = datacount + 1π            FOR L = LPS TO 1 STEP -1π               POKE c, clrπ               c = c + 1π            NEXT Lπ            c = c - 1π         ELSEπ         '*** Since the byte was less than 192, then we just poke theπ         '*** pixel to the screen.π            POKE c, clrπ         END IFπ      NEXT cπ      '*** We'll move to the second half of the screen by adding 32,000π      '*** (HEX = 7D0) bytes to our segment value.π      fxoffset = fxoffset + &H7D0π   NEXT halfππ'*** All done!  Close the file.πCLOSE pcxnumππ'*** Return to BASIC's default segment. Very important!πDEF SEGππEND SUBπJonathan Leger                 GRAPHICS LOADER UPDATE         leger@mail.dtx.net             09-02-96 (10:10)       QB, QBasic, PDS        981  27476    FX2.BAS     DEFINT A-Zππ'**** Screen routinesπDECLARE SUB LoadGif (file$)πDECLARE SUB LoadPcx (file$)πDECLARE SUB BsaveScreen (file$)πDECLARE SUB GiftoBSAVE (gif$, bsave$, pal$)ππ'*** Palette routinesπDECLARE SUB GetPal (pal())πDECLARE SUB PutPal (pal())πDECLARE SUB SavePal (file$)πDECLARE SUB LoadPal (file$)πDECLARE SUB RotatePal (direction, pal())πDECLARE SUB CyclePal (direction, pal(), numcycles)ππ'*** Palette fxπDECLARE SUB FadeOut (pal())πDECLARE SUB FadeIn (pal())πDECLARE SUB BlackOut ()ππ'*** Drawing RoutinesπDECLARE SUB ClrScr (col)ππ'*** Font routinesπDECLARE SUB Font (Text$, XStart, Ystart, Xscale, Yscale, Style, clr)πDECLARE SUB LoadFont ()πDECLARE SUB MakeFont ()πDECLARE SUB FontPal ()ππ'*** EMS routinesπDECLARE FUNCTION NumEMSHandles% ()πDECLARE FUNCTION NumEMSPages% (Handle%)πDECLARE FUNCTION GetEMS% (numpages%)πDECLARE FUNCTION EMSPages% (func%)πDECLARE FUNCTION PageFrame% ()πDECLARE FUNCTION EMSstatus% ()πDECLARE SUB ReleaseEMS (Handle%)πDECLARE SUB MapEMS (Handle%, block%)ππ'*** Memory manipulation routinesπDECLARE SUB MemCopy (fromseg, fromoff, toseg, tooff, numbytes)πDECLARE SUB FillChar (segment, offset, value, bytes)ππ'*** MiscelaneousπDECLARE SUB WaitRetrace ()ππOPTION BASE 0ππ'$STATICπDIM pal1(0 TO 255, 3) AS INTEGERπDIM pal2(0 TO 255, 3) AS INTEGERπDIM SHARED FontBuf(0) AS STRING * 10368ππ'$DYNAMICππLoadFontππSCREEN 13ππGetPal pal1()ππFontPalπGetPal pal2()πBlackOutππFont "BASIC FX", 50, 75, 3, 3, 3, 70πFadeIn pal2()ππWHILE INKEY$ = "": WENDπFadeOut pal2()πCLSππFont "The font routines were written by:", 0, 0, 1, 1, 3, 120πFont "Luke Molnar", 70, 25, 2, 2, 3, 1πFont "Other routines written/collected by:", 0, 100, 1, 1, 3, 120πFont "Jonathan Leger", 40, 125, 2, 2, 3, 1ππFadeIn pal2()ππWHILE INKEY$ = "": WENDππFadeOut pal2()πCLSππPutPal pal1()ππFont "LoadGif()", 115, 100, 1, 1, 5, 15πFont "press a key", 105, 125, 1, 1, 5, 15πWHILE INKEY$ = "": WENDππLoadGif "letterma.gif"ππFOR snd = 1000 TO 1500 STEP 100π   SOUND snd, .1π   SOUND snd + 100, .1π   SOUND snd + 200, .1πNEXT sndππWHILE INKEY$ = "": WENDππCLSπPutPal pal1()ππFont "LoadPcx()", 115, 100, 1, 1, 5, 15πFont "press a key", 105, 125, 1, 1, 5, 15πWHILE INKEY$ = "": WENDππLoadPcx "bwface.pcx"πFOR snd = 1000 TO 1500 STEP 100π   SOUND snd, .1π   SOUND snd + 100, .1π   SOUND snd + 200, .1πNEXT sndππWHILE INKEY$ = "": WENDππIF EMSstatus THENπ   IF EMSPages(1) >= 4 THENπ      PCXHandle = GetEMS(4)π      MapEMS PCXHandle, 0π      MemCopy &HA000, 0, PageFrame, 0, &HFA00π      CLSπ      Font "The previous picture has been", 0, 0, 1, 1, 5, 15π      Font "loaded into EMS memory.", 0, 25, 1, 1, 5, 15π      Font "Press any key to load picture.", 0, 50, 1, 1, 5, 15π      WHILE INKEY$ = "": WENDπ      MemCopy PageFrame, 0, &HA000, 0, &HFA00π      WHILE INKEY$ = "": WENDπ      ReleaseEMS PCXHandleπ   END IFπEND IFππGetPal pal2()ππFont "CyclePal()", 115, 100, 1, 1, 5, 15ππDO UNTIL LEN(INKEY$) > 0π   CyclePal 1, pal2(), 1πLOOPππBlackOutπCLSππFontPalπGetPal pal2()πFont "Making differnt color backgrounds", 0, 0, 1, 1, 5, 50πFont "is easy (and fast!) with ClrScr()...", 0, 25, 1, 1, 5, 50πFont "press a key", 105, 125, 1, 1, 5, 50πWHILE INKEY$ = "": WENDππRANDOMIZE TIMERπFOR x = 50 TO 200 STEP 40π   ClrScr xπ   DO: LOOP UNTIL LEN(INKEY$)πNEXT xππFillChar &HA000, 0, 0, &HFA00πBlackOutππFont "End of..", 0, 25, 1, 1, 5, 18πFont "BASIC FX", 50, 75, 3, 3, 3, 70πFont "...Demo", 240, 145, 1, 1, 5, 18πFadeIn pal2()ππWHILE INKEY$ = "": WENDπFadeOut pal2()πCLSπPutPal pal1()ππSCREEN 0πWIDTH 80, 25πENDππREM $STATICπSUB BlackOutππ   FOR clr = 0 TO 255π      OUT &H3C8, clrπ      OUT &H3C9, 0π      OUT &H3C9, 0π      OUT &H3C9, 0π   NEXT clrππEND SUBππSUB BsaveScreen (file$)ππDEF SEG = &HA000πBSAVE file$, 0, 64000πDEF SEGππEND SUBππSUB ClrScr (col)ππFillChar &HA000, 0, col, &HFA00ππEND SUBππSUB CyclePal (direction, pal(), numcycles)ππFOR x = 1 TO numcyclesπ   WaitRetraceπ   RotatePal direction, pal()πNEXT xππEND SUBππ'************* EMSPages%() ****************π'*** When func% is 0, returns the total ***π'*** number of 16k pages, when func% is ***π'*** 1, returns the number of available ***π'*** 16k pages.                         ***π'******************************************πFUNCTION EMSPages% (func%)ππasm$ = ""πasm$ = asm$ + CHR$(85) + CHR$(137) + CHR$(229) + CHR$(180)πasm$ = asm$ + CHR$(66) + CHR$(205) + CHR$(103) + CHR$(139) + CHR$(126)πasm$ = asm$ + CHR$(6) + CHR$(137) + CHR$(29) + CHR$(139) + CHR$(126)πasm$ = asm$ + CHR$(8) + CHR$(137) + CHR$(21) + CHR$(93) + CHR$(203)ππTotalPages% = 0: AvailablePages% = 0ππDEF SEG = VARSEG(asm$)π   CALL Absolute(TotalPages%, AvailablePages%, SADD(asm$))πDEF SEGππIF func% = 0 THENπ   EMSPages% = TotalPages%πELSEπ   EMSPages% = AvailablePages%πEND IFππEND FUNCTIONππ'**************** EMSstatus%() ******************π'*** Returns whether EMS is available.  -1 is ***π'*** returned if it is available, 0 otherwise ***π'************************************************πFUNCTION EMSstatus%ππasm$ = ""πasm$ = asm$ + CHR$(85) + CHR$(137) + CHR$(229) + CHR$(180)πasm$ = asm$ + CHR$(64) + CHR$(205) + CHR$(103) + CHR$(176) + CHR$(0)πasm$ = asm$ + CHR$(139) + CHR$(94) + CHR$(6) + CHR$(137) + CHR$(7)πasm$ = asm$ + CHR$(93) + CHR$(203)ππEMS% = -1πDEF SEG = VARSEG(asm$)π   CALL Absolute(EMS%, SADD(asm$))πDEF SEGππIF EMS% = 0 THENπ   EMSstatus = -1         'EMS installed, set to BASIC's TRUE value.πELSEπ   EMSstatus = 0          'EMS not installed, set to FALSE.πEND IFππEND FUNCTIONππSUB FadeIn (pal())ππDIM Tmp(0 TO 255, 3)ππFOR lp = 1 TO 64π   FOR clr = 0 TO 255π      FOR rgb = 1 TO 3π         IF Tmp(clr, rgb) < pal(clr, rgb) THENπ            Tmp(clr, rgb) = Tmp(clr, rgb) + 1π         END IFπ      NEXT rgbπ      OUT &H3C8, clrπ      OUT &H3C9, Tmp(clr, 1)π      OUT &H3C9, Tmp(clr, 2)π      OUT &H3C9, Tmp(clr, 3)π   NEXT clrπNEXT lpπππEND SUBππSUB FadeOut (pal())ππDIM Tmp(0 TO 255, 3)ππFOR clr = 0 TO 255π   FOR rgb = 1 TO 3π      Tmp(clr, rgb) = pal(clr, rgb)π   NEXT rgbπNEXT clrππFOR lp = 1 TO 64π   FOR clr = 0 TO 255π      FOR rgb = 1 TO 3π         IF Tmp(clr, rgb) > 0 THENπ            Tmp(clr, rgb) = Tmp(clr, rgb) - 1π         END IFπ      NEXT rgbπ      OUT &H3C8, clrπ      OUT &H3C9, Tmp(clr, 1)π      OUT &H3C9, Tmp(clr, 2)π      OUT &H3C9, Tmp(clr, 3)π   NEXT clrπNEXT lpπππEND SUBππSUB FillChar (segment, offset, value, bytes)ππasm$ = ""πasm$ = asm$ + CHR$(85) + CHR$(137) + CHR$(229) + CHR$(139)πasm$ = asm$ + CHR$(78) + CHR$(6) + CHR$(139) + CHR$(86) + CHR$(8)πasm$ = asm$ + CHR$(139) + CHR$(70) + CHR$(12) + CHR$(30) + CHR$(142)πasm$ = asm$ + CHR$(216) + CHR$(139) + CHR$(94) + CHR$(10) + CHR$(136)πasm$ = asm$ + CHR$(23) + CHR$(67) + CHR$(226) + CHR$(251) + CHR$(31)πasm$ = asm$ + CHR$(93) + CHR$(203)ππDEF SEG = VARSEG(asm$)π   CALL Absolute(BYVAL segment, BYVAL offset, BYVAL value, BYVAL bytes, SADD(asm$))πDEF SEGππEND SUBππSUB Font (Text$, XStart, Ystart, Xscale, Yscale, Style, clr)ππpx = XStart  ' physical x and physical yπpy = YstartππLHeight = Yscale * 8πOptimize = 63 \ LHeight ' Any constant math operations done multipe timesπ                          ' in the main loop should, well, not be doneπ                          ' in the main loop.πππ' Instead of wasting our time with all this MID$ garbage to access bytes inπ' font buffer, we'll just take a PEEK directly at them.πDEF SEG = VARSEG(FontBuf(0))ππ FOR h = 1 TO LEN(Text$)π  FPtr = 81 * (ASC(MID$(Text$, h, 1)) - 1) - 1π  FOR x = 0 TO 8π   FOR y = 0 TO 8ππ    col = PEEK(VARPTR(FontBuf(0)) + FPtr)π    FPtr = FPtr + 1π    IF col THENπ     SELECT CASE Styleπ      ' If you desire a y scale factor greater than 8, youπ      ' must change the division to higher precision...very slow.π      ' Or, you could find a way around it.π      CASE 1: PSET (px, py), Optimize * (py - Ystart) + clrπ              LINE (px, py)-(px, py + Yscale), Optimize * (py - Ystart) + clrπ      ' Notice how this style only uses 54 colors, so you can see the topπ      ' of the letters where they would normally be blackπ      CASE 2: CIRCLE (px, py), Yscale, (54 \ LHeight) * (py - Ystart) + clr + 9, , , 4π      CASE 3:  FOR sty = px TO px + Xscaleπ                FOR sty2 = py TO py + Yscaleπ                 PSET (sty, sty2), Optimize * (sty2 - Ystart) + clrπ                 IF POINT(sty - 1, sty2) = 0 THEN PSET (sty - 1, sty2), 63 + clr - 1π                 IF POINT(sty, sty2 - 1) = 0 THEN PSET (sty, sty2 - 1), 63 + clr - 1π                NEXTπ               NEXTπ       CASE 4: FOR sty = px TO px + Xscaleπ                FOR sty2 = py TO py + Yscaleπ                 PSET (sty + .4 * sty2, sty2), Optimize * (sty2 - Ystart) + clrπ                 IF POINT((sty - 1) + .4 * sty2, sty2) = 0 THEN PSET ((sty - 1) + .4 * sty2, sty2), 63 + clr - 1π                NEXTπ               NEXTπ       CASE ELSEπ            PSET (px, py), clrπ     END SELECTπ    END IFπ    py = py + Yscaleπ   NEXTπ  px = px + Xscaleπ  py = Ystartπ  NEXTπ NEXT hπDEF SEGππEND SUBππSUB FontPalπFOR x = 1 TO 63π OUT &H3C8, xπ OUT &H3C9, xπ OUT &H3C9, 0π OUT &H3C9, 0πNEXTπFOR x = 64 TO 126π OUT &H3C8, xπ OUT &H3C9, 0π OUT &H3C9, xπ OUT &H3C9, 0πNEXTπFOR x = 127 TO 189π OUT &H3C8, xπ OUT &H3C9, 0π OUT &H3C9, 0π OUT &H3C9, xπNEXTπFOR x = 190 TO 252π OUT &H3C8, xπ OUT &H3C9, xπ OUT &H3C9, 0π OUT &H3C9, xπNEXTπFOR x = 253 TO 255π OUT &H3C8, xπ OUT &H3C9, xπ OUT &H3C9, xπ OUT &H3C9, xπNEXTπEND SUBππ'********************** GetEMS%() ********************π'*** Function returns the handle value for a block ***π'*** of EMS memory that consists of numpages% 16k  ***π'*** pages.  You _must_ keep the handle value for  ***π'*** later calls that require the handle.  Example:***π'***                                               ***π'*** EmsHandle% = GetEMS%(5)                       ***π'***                                               ***π'*** EmsHandle% holds the handle info for a block  ***π'*** of memory 5 16k pages in size, oh 80k.        ***π'*****************************************************πFUNCTION GetEMS% (numpages%)ππ'pageoffset% = EMSPages%(0) - EMSPages%(1)ππasm$ = ""πasm$ = asm$ + CHR$(85) + CHR$(137) + CHR$(229) + CHR$(139)πasm$ = asm$ + CHR$(94) + CHR$(8) + CHR$(180) + CHR$(67) + CHR$(205)πasm$ = asm$ + CHR$(103) + CHR$(139) + CHR$(94) + CHR$(6) + CHR$(137)πasm$ = asm$ + CHR$(23) + CHR$(93) + CHR$(203)ππHandle% = 0πDEF SEG = VARSEG(asm$)π   CALL Absolute(BYVAL numpages%, Handle%, SADD(asm$))πDEF SEGππ'asm$ = ""π'asm$ = asm$ + CHR$(85) + CHR$(137) + CHR$(229) + CHR$(139)π'asm$ = asm$ + CHR$(86) + CHR$(8) + CHR$(139) + CHR$(126) + CHR$(6)π'asm$ = asm$ + CHR$(139) + CHR$(118) + CHR$(10) + CHR$(177) + CHR$(0)π'asm$ = asm$ + CHR$(48) + CHR$(237) + CHR$(180) + CHR$(68) + CHR$(136)π'asm$ = asm$ + CHR$(200) + CHR$(137) + CHR$(243) + CHR$(205) + CHR$(103)π'asm$ = asm$ + CHR$(70) + CHR$(65) + CHR$(57) + CHR$(254) + CHR$(117)π'asm$ = asm$ + CHR$(242) + CHR$(93) + CHR$(203)π'π'DEF SEG = VARSEG(asm$)π'   CALL Absolute(BYVAL pageoffset%, BYVAL Handle%, BYVAL numpages%, SADD(asm$))π'DEF SEGππGetEMS% = Handle%ππEND FUNCTIONππSUB GetPal (pal())π   FOR clr = 0 TO 255π      OUT &H3C7, clrπ      pal(clr, 1) = INP(&H3C9)π      pal(clr, 2) = INP(&H3C9)π      pal(clr, 3) = INP(&H3C9)π   NEXT clrπEND SUBππSUB GiftoBSAVE (gif$, bsave$, pal$)ππLoadGif gif$πBsaveScreen bsave$πSavePal pal$ππEND SUBππSUB LoadFontππ   fontfile = FREEFILEππ   OPEN "basefont.dat" FOR BINARY AS #fontfileππ   IF LOF(fontfile) < 20655 THENπ      SCREEN 0: WIDTH 80, 25π      COLOR 7π      PRINT "Font data file missing or corrupt.  Rebuild it? [(Y)/n]";π      DOπ         key$ = UCASE$(INKEY$)π      LOOP UNTIL key$ = "N" OR key$ = "Y"π      CLOSE fontfileπ      IF key$ = "N" THEN EXIT SUBπ      MakeFontπ      fontfile = FREEFILEπ      OPEN "basefont.dat" FOR BINARY AS #fontfileπ   END IFππ   GET #fontfile, , FontBuf(0)π   CLOSE #fontfileππEND SUBππSUB LoadGif (file$)πDIM byte AS STRING * 1πDIM Prefix(4095), Suffix(4095), OutStack(4095), shiftout(8)πDIM Ybase AS LONG, powersof2(11) AS LONG, WorkCode AS LONGππFOR a = 0 TO 7: shiftout(8 - a) = 2 ^ a: NEXT aπFOR a = 0 TO 11: powersof2(a) = 2 ^ a: NEXT aππgiffile = FREEFILEπOPEN file$ FOR BINARY AS #giffileπfile$ = "      ": GET #giffile, , file$πIF file$ <> "GIF87a" THEN PRINT "Not a GIF87a file.": ENDπGET #giffile, , TotalX: GET #giffile, , TotalY: GOSUB GetByteπNumColors = 2 ^ ((a AND 7) + 1): NoPalette = (a AND 128) = 0πGOSUB GetByte: Background = aπGOSUB GetByte: IF a <> 0 THEN PRINT "Bad screen descriptor.": ENDπIF NoPalette = 0 THEN P$ = SPACE$(NumColors * 3): GET #giffile, , P$πDOπ    GOSUB GetByteπ    IF a = 44 THENπ        EXIT DOπ    ELSEIF a <> 33 THENπ        PRINT "Unknown extension type.": ENDπ    END IFπ    GOSUB GetByteπ    DO: GOSUB GetByte: file$ = SPACE$(a): GET #giffile, , file$: LOOP UNTIL a = 0πLOOPπGET #giffile, , XStart: GET #giffile, , Ystart: GET #giffile, , XLength: GET #giffile, , YLengthπXEnd = XStart + XLength: YEnd = Ystart + YLength: GOSUB GetByteπIF a AND 128 THEN PRINT "Can't handle local colormaps.": ENDπInterlaced = a AND 64: PassNumber = 0: PassStep = 8πGOSUB GetByteπClearCode = 2 ^ aπEOSCode = ClearCode + 1πFirstCode = ClearCode + 2: NextCode = FirstCodeπStartCodeSize = a + 1: CodeSize = StartCodeSizeπStartMaxCode = 2 ^ (a + 1) - 1: MaxCode = StartMaxCodeππBitsIn = 0: BlockSize = 0: BlockPointer = 1πx = XStart: y = Ystart: Ybase = y * 320&ππIF ActivePageNum = VisiblePageNum THENπ   DEF SEG = &HA000πELSEπ   DEF SEG = VideoSegmentπEND IFππIF NoPalette = 0 THENπ    OUT &H3C7, 0: OUT &H3C8, 0π    FOR a = 1 TO NumColors * 3: OUT &H3C9, ASC(MID$(P$, a, 1)) \ 4: NEXT aπEND IFπLINE (0, 0)-(319, 199), Background, BFπDOπ    GOSUB GetCodeπ    IF Code <> EOSCode THENπ        IF Code = ClearCode THENπ            NextCode = FirstCodeπ            CodeSize = StartCodeSizeπ            MaxCode = StartMaxCodeπ            GOSUB GetCodeπ            CurCode = Code: LastCode = Code: LastPixel = Codeπ            IF x < 320 THEN POKE x + Ybase, LastPixelπ            x = x + 1: IF x = XEnd THEN GOSUB NextScanLineπ        ELSEπ            CurCode = Code: StackPointer = 0π            IF Code > NextCode THEN EXIT DOπ            IF Code = NextCode THENπ                CurCode = LastCodeπ                OutStack(StackPointer) = LastPixelπ                StackPointer = StackPointer + 1π            END IFππ            DO WHILE CurCode >= FirstCodeπ                OutStack(StackPointer) = Suffix(CurCode)π                StackPointer = StackPointer + 1π                CurCode = Prefix(CurCode)π            LOOPππ            LastPixel = CurCodeπ            IF x < 320 THEN POKE x + Ybase, LastPixelπ            x = x + 1: IF x = XEnd THEN GOSUB NextScanLineππ            FOR a = StackPointer - 1 TO 0 STEP -1π                IF x < 320 THEN POKE x + Ybase, OutStack(a)π                x = x + 1: IF x = XEnd THEN GOSUB NextScanLineπ            NEXT aππ            IF NextCode < 4096 THENπ                Prefix(NextCode) = LastCodeπ                Suffix(NextCode) = LastPixelπ                NextCode = NextCode + 1π                IF NextCode > MaxCode AND CodeSize < 12 THENπ                    CodeSize = CodeSize + 1π                    MaxCode = MaxCode * 2 + 1π                END IFπ            END IFπ            LastCode = Codeπ        END IFπ    END IFπLOOP UNTIL DoneFlag OR Code = EOSCodeπGOTO LeaveProcππGetByte: file$ = " ": GET #giffile, , file$: a = ASC(file$): RETURNππNextScanLine:π    IF Interlaced THENπ        y = y + PassStepπ        IF y >= YEnd THENπ            PassNumber = PassNumber + 1π            SELECT CASE PassNumberπ            CASE 1: y = 4: PassStep = 8π            CASE 2: y = 2: PassStep = 4π            CASE 3: y = 1: PassStep = 2π            END SELECTπ        END IFπ    ELSEπ        y = y + 1π    END IFπ    x = XStart: Ybase = y * 320&: DoneFlag = y > 199πRETURNπGetCode:π    IF BitsIn = 0 THEN GOSUB ReadBufferedByte: LastChar = a: BitsIn = 8π    WorkCode = LastChar \ shiftout(BitsIn)π    DO WHILE CodeSize > BitsInπ        GOSUB ReadBufferedByte: LastChar = aπ        WorkCode = WorkCode OR LastChar * powersof2(BitsIn)π        BitsIn = BitsIn + 8π    LOOPπ    BitsIn = BitsIn - CodeSizeπ    Code = WorkCode AND MaxCodeπRETURNπReadBufferedByte:π    IF BlockPointer > BlockSize THENπ        GOSUB GetByte: BlockSize = aπ        file$ = SPACE$(BlockSize): GET #giffile, , file$π        BlockPointer = 1π    END IFπ    a = ASC(MID$(file$, BlockPointer, 1)): BlockPointer = BlockPointer + 1πRETURNπLeaveProc:πCLOSEππEND SUBππSUB LoadPal (file$)ππpalfile = FREEFILEπOPEN file$ FOR BINARY AS palfileππFOR clr = 0 TO 255π   OUT &H3C8, clrπ   OUT &H3C9, ASC(INPUT$(1, palfile))π   OUT &H3C9, ASC(INPUT$(1, palfile))π   OUT &H3C9, ASC(INPUT$(1, palfile))πNEXT clrππCLOSE palfileππEND SUBππSUB LoadPcx (file$)ππ   SCREEN 13ππ   DIM pcxpal AS STRING * 768, pcxversion AS STRING * 1ππ   pcxnum = FREEFILEπ   OPEN file$ FOR BINARY AS #pcxnumππ   IF LOF(pcxnum) = 0 THENπ      CLOSE pcxnumπ      KILL file$π      EXIT SUBπ   END IFππ   GET #pcxnum, 2, pcxversionππ   IF ASC(pcxversion) = 5 THENπ      GET #1, LOF(pcxnum) - 767, pcxpalπ      pal = 0π      FOR P = 1 TO 768 STEP 3π         OUT &H3C8, palπ         red% = INT(ASC(MID$(pcxpal, P, 1)) / 4)π         OUT &H3C9, red%π         green% = INT(ASC(MID$(pcxpal, P + 1, 1)) / 4)π         OUT &H3C9, green%π         blue% = INT(ASC(MID$(pcxpal, P + 2, 1)) / 4)π         OUT &H3C9, blue%π         pal = pal + 1π      NEXT Pπ   END IFπ π   SEEK #pcxnum, 129π π   fxoffset = 0: fxsegment = &HA000ππ   datasize = 2000π π   pcxdata$ = INPUT$(datasize, pcxnum)π   datacount = 1π   FOR half = 1 TO 2π      fxtotal = fxsegment + fxoffsetπ      DEF SEG = fxtotalπ      FOR c = 0 TO 31999π         IF datacount > datasize THENπ            pcxdata$ = INPUT$(datasize, pcxnum)π            datacount = 1π         END IFπ         clr = ASC(MID$(pcxdata$, datacount, 1))π         datacount = datacount + 1π         IF datacount > datasize THENπ            pcxdata$ = INPUT$(datasize, pcxnum)π            datacount = 1π         END IFπ         IF clr > 192 THENπ            LPS = clr - 192π            clr = ASC(MID$(pcxdata$, datacount, 1))π            datacount = datacount + 1π            FOR L = LPS TO 1 STEP -1π               POKE c, clrπ               c = c + 1π            NEXT Lπ            c = c - 1π         ELSEπ            POKE c, clrπ         END IFπ      NEXT cπ      fxoffset = fxoffset + &H7D0π   NEXT halfππ   CLOSE pcxnumππ   DEF SEGππEND SUBππSUB MakeFontππfontfile = FREEFILEππOPEN "basefont.dat" FOR BINARY AS #fontfileπ' Hey, change 128 to 255 for the full font.πCLSπSCREEN 13πCOLOR 16πFOR ascii = 1 TO 255π CLSπ PRINT CHR$(ascii)π FOR x = 0 TO 8π  FOR y = 0 TO 8π   pnt$ = CHR$(POINT(x, y))π   PUT #fontfile, , pnt$π   pnt$ = ""π  NEXTπ NEXTπNEXTπCLOSEπOPEN "basefont.dat" FOR BINARY AS #fontfileπ GET #fontfile, , FontBuf(0)πCLOSE #fontfileπEND SUBππ'***************** MapEMS () ***********************************π'*** Sets the page of a memory block (identified by Handle%) ***π'*** that is located at the beginning of the page frame.     ***π'*** Example:                                                ***π'***                                                         ***π'*** EmsHandle% = GetEMS%(8)                                 ***π'*** MapEMS EmsHandle%, 4                                    ***π'***                                                         ***π'*** When the page frame segment is next written to, the info***π'*** will be placed starting at the 4th page in the block of ***π'*** memory represented by EmsHandle%.  This could be use,   ***π'*** for instance, to store multiple SCREEN 13 images in one ***π'*** EMS block, by moving the first 64k image into the first ***π'*** 4 16k pages (16000 * 4 = 64000) by using:               ***π'***                                                         ***π'*** MapEMS EmsHandle%, 0                                    ***π'***                                                         ***π'*** And then putting the next 64k image into the next 4 EMS ***π'*** pages by using:                                         ***π'***                                                         ***π'*** MapEMS EmsHandle%, 4                                    ***π'***                                                         ***π'*** ... and then moving the image into the memory block.    ***π'***************************************************************πSUB MapEMS (Handle%, pageoffset%)ππnumpages% = 4ππasm$ = ""πasm$ = asm$ + CHR$(85) + CHR$(137) + CHR$(229) + CHR$(139)πasm$ = asm$ + CHR$(86) + CHR$(8) + CHR$(139) + CHR$(126) + CHR$(6)πasm$ = asm$ + CHR$(139) + CHR$(118) + CHR$(10) + CHR$(177) + CHR$(0)πasm$ = asm$ + CHR$(48) + CHR$(237) + CHR$(180) + CHR$(68) + CHR$(136)πasm$ = asm$ + CHR$(200) + CHR$(137) + CHR$(243) + CHR$(205) + CHR$(103)πasm$ = asm$ + CHR$(70) + CHR$(65) + CHR$(57) + CHR$(249) + CHR$(117)πasm$ = asm$ + CHR$(242) + CHR$(93) + CHR$(203)ππDEF SEG = VARSEG(asm$)π   CALL Absolute(BYVAL pageoffset%, BYVAL Handle%, BYVAL numpages%, SADD(asm$))πDEF SEGππEND SUBππSUB MemCopy (fromseg, fromoff, toseg, tooff, bytes)ππasm$ = ""πasm$ = asm$ + CHR$(85) + CHR$(137) + CHR$(229) + CHR$(30)πasm$ = asm$ + CHR$(139) + CHR$(70) + CHR$(10) + CHR$(142) + CHR$(192)πasm$ = asm$ + CHR$(139) + CHR$(70) + CHR$(14) + CHR$(142) + CHR$(216)πasm$ = asm$ + CHR$(139) + CHR$(118) + CHR$(8) + CHR$(139) + CHR$(126)πasm$ = asm$ + CHR$(12) + CHR$(139) + CHR$(78) + CHR$(6) + CHR$(243)πasm$ = asm$ + CHR$(164) + CHR$(31) + CHR$(93) + CHR$(203)ππDEF SEG = VARSEG(asm$)π   CALL Absolute(BYVAL fromseg, BYVAL fromoff, BYVAL toseg, BYVAL tooff, BYVAL bytes, SADD(asm$))πDEF SEGππEND SUBππ'****************************** NumEMSHandles%() *********************π'*** Returns the number of EMS handles presently being used (there ***π'*** are a maximum of 256 handles possible at any given time).     ***π'*********************************************************************πFUNCTION NumEMSHandles%ππasm$ = ""πasm$ = asm$ + CHR$(85) + CHR$(137) + CHR$(229) + CHR$(180)πasm$ = asm$ + CHR$(75) + CHR$(205) + CHR$(103) + CHR$(139) + CHR$(126)πasm$ = asm$ + CHR$(6) + CHR$(137) + CHR$(29) + CHR$(93) + CHR$(203)ππNumHandles% = 0πDEF SEG = VARSEG(asm$)π   CALL Absolute(NumHandles%, SADD(asm$))πDEF SEGππNumEMSHandles% = NumHandles%ππEND FUNCTIONππ'***************************** NumEMSPages%() *************************π'*** Returns the number of 16k pages being used by the memory block ***π'*** that is represented by Handle%.                                ***π'**********************************************************************πFUNCTION NumEMSPages% (Handle%)ππasm$ = ""πasm$ = asm$ + CHR$(85) + CHR$(137) + CHR$(229) + CHR$(139)πasm$ = asm$ + CHR$(86) + CHR$(6) + CHR$(180) + CHR$(76) + CHR$(205)πasm$ = asm$ + CHR$(103) + CHR$(139) + CHR$(126) + CHR$(8) + CHR$(137)πasm$ = asm$ + CHR$(29) + CHR$(93) + CHR$(203)ππDEF SEG = VARSEG(asm$)π   CALL Absolute(numpages%, Handle%, SADD(asm$))πDEF SEGππNumEMSPages% = numpages%ππEND FUNCTIONππ'******************************* PageFrame% ***************************π'*** Returns the segment that you will need to write to in order to ***π'*** store your data into EMS memory.  For example, PageFrame% may  ***π'*** return D000 (HEX, -12288 decimal), and then you might do this: ***π'***                                                                ***π'*** DEF SEG = PageFrame%        'D000                              ***π'*** MyData$ = "This is a block of data I want to store in EMS."    ***π'*** FOR X = 1 TO LEN(MyData$)                                      ***π'***   POKE X, ASC(MID$(MyData$, X, 1))                             ***π'*** NEXT X                                                         ***π'*** DEF SEG                                                        ***π'***                                                                ***π'*** Note, though, that you have to have a block of EMS opened with ***π'*** GetEMS%() and maped with MapEMS before you can write to the    ***π'*** block.                                                         ***π'**********************************************************************πFUNCTION PageFrame%ππasm$ = ""πasm$ = asm$ + CHR$(85) + CHR$(137) + CHR$(229) + CHR$(180)πasm$ = asm$ + CHR$(65) + CHR$(205) + CHR$(103) + CHR$(139) + CHR$(126)πasm$ = asm$ + CHR$(6) + CHR$(137) + CHR$(29) + CHR$(93) + CHR$(203)ππPageFrameAddr% = 0πDEF SEG = VARSEG(asm$)π   CALL Absolute(PageFrameAddr%, SADD(asm$))πDEF SEGππPageFrame% = PageFrameAddr%ππEND FUNCTIONππSUB PutPal (pal())π  π   FOR clr = 0 TO 255π      OUT &H3C8, clrπ      OUT &H3C9, pal(clr, 1)π      OUT &H3C9, pal(clr, 2)π      OUT &H3C9, pal(clr, 3)π   NEXT clrππEND SUBππ'****************************** ReleaseEMS() **************************π'*** Releases the EMS memory associated with Handle%.  This is very ***π'*** important to do before you exit your program, otherwise the    ***π'*** memory being used by your open handles will not be available   ***π'*** again until you reboot.                                        ***π'**********************************************************************πSUB ReleaseEMS (Handle%)ππasm$ = ""πasm$ = asm$ + CHR$(85) + CHR$(137) + CHR$(229) + CHR$(180)πasm$ = asm$ + CHR$(69) + CHR$(139) + CHR$(86) + CHR$(6) + CHR$(205)πasm$ = asm$ + CHR$(103) + CHR$(93) + CHR$(203)ππDEF SEG = VARSEG(asm$)π   CALL Absolute(BYVAL Handle%, SADD(asm$))πDEF SEGππEND SUBππSUB RotatePal (direction, pal())ππ   SELECT CASE directionπ         CASE 1π            temp1 = pal(255, 1)π            temp2 = pal(255, 2)π            temp3 = pal(255, 3)π            FOR rgb = 1 TO 3π               FOR col = 254 TO 0 STEP -1π                  pal(col + 1, rgb) = pal(col, rgb)π               NEXT colπ            NEXT rgbπ            pal(0, 1) = temp1π            pal(0, 2) = temp2π            pal(0, 3) = temp3π         CASE -1π            temp1 = pal(0, 1)π            temp2 = pal(0, 2)π            temp3 = pal(0, 3)π            FOR rgb = 1 TO 3π               FOR col = 0 TO 254π                  pal(col, rgb) = pal(col + 1, rgb)π               NEXT colπ            NEXT rgbπ            pal(255, 1) = temp1π            pal(255, 2) = temp2π            pal(255, 3) = temp3π   END SELECTππ   PutPal pal()ππEND SUBππSUB SavePal (file$)ππ   palfile = FREEFILEπ   OPEN file$ FOR OUTPUT AS palfileππ   FOR clr = 0 TO 255π      OUT &H3C7, clrπ      PRINT #palfile, CHR$(INP(&H3C9));π      PRINT #palfile, CHR$(INP(&H3C9));π      PRINT #palfile, CHR$(INP(&H3C9));π   NEXT clrππ   CLOSE palfileππEND SUBππSUB SetPal (pal())πEND SUBππSUB WaitRetraceπ   WAIT &H3DA, 8πEND SUBπRyan White                     VORTEX                         BIGFOOT@SunBelt.Net            09-06-96 (11:42)       QB, QBasic, PDS        39   2397     VORTEX.BAS  'Vortexπ'By Ryan Whiteπ'This is a sample of my abilities with palettes and wierd designs.π'If you would like to get more of these type programs, write me atπ'Bigfoot@Sunbelt.Net  or  Bigfoot@InfoAve.Netπ'I have more than 575 Qbasic programs to my name, and it grows daily.π'Ah well, enjoy...πππ'This one is much faster compiled.   A little too fast.ππSCREEN 13πDEFINT A-WπCLSπDIM c(255, 2), co(255, 2)πFOR n = 0 TO 15πc(n, 0) = n * 4: c(n, 1) = n * 4: c(n, 2) = n * 4: c(n + 16, 0) = 63: c(n + 16, 1) = 63 - n * 4: c(n + 16, 2) = 63 - n * 4: c(n + 32, 0) = 63: c(n + 32, 1) = n * 2: c(n + 32, 2) = 0πc(n + 48, 0) = 63: c(n + 48, 1) = n * 2 + 31: c(n + 48, 2) = 0: c(n + 64, 0) = 63 - n * 4: c(n + 64, 1) = 63: c(n + 64, 2) = 0: c(n + 80, 0) = 0: c(n + 80, 1) = 63 - n * 2: c(n + 80, 2) = n * 4πc(n + 96, 0) = 0: c(n + 96, 1) = 32 - n * 2: c(n + 96, 2) = 60: c(n + 112, 0) = n * 3: c(n + 112, 1) = 0: c(n + 112, 2) = 60: c(n + 128, 0) = 45 - n * 3: c(n + 128, 1) = 0: c(n + 128, 2) = 60πc(n + 144, 0) = 0: c(n + 144, 1) = n * 2: c(n + 144, 2) = 60: c(n + 160, 0) = 0: c(n + 160, 1) = 30 + n * 2: c(n + 160, 2) = 60 - n * 4: c(n + 176, 0) = n * 4: c(n + 176, 1) = 63: c(n + 176, 2) = 0πc(n + 192, 0) = 63: c(n + 192, 1) = 60 - n * 2: c(n + 192, 2) = 0: c(n + 208, 0) = 63: c(n + 208, 1) = 30 - n * 2: c(n + 208, 2) = 0: c(n + 224, 0) = 60 - n * 2: c(n + 224, 1) = n * 2: c(n + 224, 2) = n * 2πc(n + 240, 0) = 30 - n * 2: c(n + 240, 1) = 30 - n * 2: c(n + 240, 2) = 30 - n * 2: NEXT n: FOR n = 1 TO 255: OUT &H3C8, n: FOR m = 0 TO 2: OUT &H3C9, c(n, m): NEXT m: NEXT nππn = 0: x = 5πFOR I = 200 TO 40 STEP -1: n = n + 1: IF n = 256 THEN n = 1πx = x / 1.003: FOR j = 1 TO 10: CIRCLE (160, I), x, n, , , .5: x = x * 1.003: NEXT jπNEXT Iππ'FOR n = -15 TO 15:LINE (105 + n, 65 + n)-(215 - n, 175 - n), 50 + n, B:NEXT nπ'FOR n = 1 TO 33:FOR m = -1 TO 1:CIRCLE (110, 170 + m), n, 255 - n, , , 1:CIRCLE (210, 170 + m), n, 255 - n, , , 1:CIRCLE (110, 70 + m), n, 255 - n, , , 1:CIRCLE (210, 70 + m), n, 255 - n, , , 1:NEXT m:NEXT nππDO UNTIL INKEY$ <> ""πFOR n = 1 TO 255: OUT &H3C7, n: FOR m = 0 TO 2: co(n, m) = INP(&H3C9): NEXT m: NEXT nπc(255, 0) = co(1, 0): c(255, 1) = co(1, 1): c(255, 2) = co(1, 2)πFOR n = 1 TO 254: FOR m = 0 TO 2: c(n, m) = co(n + 1, m): NEXT m: NEXT nπFOR n = 1 TO 255: OUT &H3C8, n: FOR m = 0 TO 2: OUT &H3C9, c(n, m): NEXT m: NEXT nπLOOPπππRyan White                     COLOR MORPH                    BIGFOOT@SunBelt.Net            09-06-96 (12:31)       QB, QBasic, PDS        80   2929     CMORPH.BAS  'color morphπ'By Ryan Whiteπ'This is a sample of my abilities with palettes and wierd designs.π'If you would like to get more of these type programs, write me atπ'Bigfoot@Sunbelt.Net  or  Bigfoot@InfoAve.Netπ'I have more than 575 Qbasic programs to my name, and it grows daily.π'Ah well, enjoy...ππSCREEN 13πCLSπDEFINT A-ZπDIM c(255, 2), co(255, 2)πFOR n = 0 TO 15π'black white red orange yellow green blue's purple ~then backwards~π'0-15      black   to  whiteπc(n, 0) = n * 4: c(n, 1) = n * 4: c(n, 2) = n * 4π'16-31     white   to  redπc(n + 16, 0) = 63: c(n + 16, 1) = 63 - n * 4: c(n + 16, 2) = 63 - n * 4π'32-47     red     to  orangeπc(n + 32, 0) = 63: c(n + 32, 1) = n * 2: c(n + 32, 2) = 0π'48-63     orange  to  yellowπc(n + 48, 0) = 63: c(n + 48, 1) = n * 2 + 31: c(n + 48, 2) = 0π'64-79     yellow  to  greenπc(n + 64, 0) = 63 - n * 4: c(n + 64, 1) = 63: c(n + 64, 2) = 0π'80-95     green   to  l.blueπc(n + 80, 0) = 0: c(n + 80, 1) = 63 - n * 2: c(n + 80, 2) = n * 4π'96-111    l.blue  to  d.blueπc(n + 96, 0) = 0: c(n + 96, 1) = 32 - n * 2: c(n + 96, 2) = 60π'112-127   d.blue  to  purpleπc(n + 112, 0) = n * 3: c(n + 112, 1) = 0: c(n + 112, 2) = 60π'128-143   purple  to  d.blueπc(n + 128, 0) = 45 - n * 3: c(n + 128, 1) = 0: c(n + 128, 2) = 60π'144-159   d.blue  to  l.blueπc(n + 144, 0) = 0: c(n + 144, 1) = n * 2: c(n + 144, 2) = 60π'160-175   l.blue  to  greenπc(n + 160, 0) = 0: c(n + 160, 1) = 30 + n * 2: c(n + 160, 2) = 60 - n * 4π'176-191   green   to  yellowπc(n + 176, 0) = n * 4: c(n + 176, 1) = 63: c(n + 176, 2) = 0π'192-207   yellow  to  orangeπc(n + 192, 0) = 63: c(n + 192, 1) = 60 - n * 2: c(n + 192, 2) = 0π'208-223   orange  to  redπc(n + 208, 0) = 63: c(n + 208, 1) = 30 - n * 2: c(n + 208, 2) = 0π'224-239   red     to  grayπc(n + 224, 0) = 60 - n * 2: c(n + 224, 1) = n * 2: c(n + 224, 2) = n * 2π'240-255   gray    to  blackπc(n + 240, 0) = 30 - n * 2: c(n + 240, 1) = 30 - n * 2: c(n + 240, 2) = 30 - n * 2πNEXT nπFOR n = 1 TO 255: OUT &H3C8, n: FOR m = 0 TO 2: OUT &H3C9, c(n, m): NEXT m: NEXT nππFOR x = 0 TO 319πc = c + 1: IF c = 256 THEN c = 1πLINE (x, 0)-(159, 100), cπNEXT xπFOR y = 0 TO 199πc = c + 1: IF c = 256 THEN c = 1πLINE (319, y)-(159, 100), cπNEXT yπFOR x = 319 TO 0 STEP -1πc = c + 1: IF c = 256 THEN c = 1πLINE (x, 199)-(159, 100), cπNEXT xπFOR y = 199 TO 0 STEP -1πc = c + 1: IF c = 256 THEN c = 1πLINE (0, y)-(159, 100), cπNEXT yππFOR r = 60 TO 1 STEP -1πFOR m = -1 TO 1πc = c + 1: IF c = 256 THEN c = 1πCIRCLE (159, 100 + m), r, c, , , 1πNEXT mπNEXT rππDO UNTIL INKEY$ <> ""πFOR n = 1 TO 255: OUT &H3C7, n: FOR m = 0 TO 2: co(n, m) = INP(&H3C9): NEXT m: NEXT nπc(255, 0) = co(1, 0): c(255, 1) = co(1, 1): c(255, 2) = co(1, 2)πFOR n = 1 TO 254: FOR m = 0 TO 2: c(n, m) = co(n + 1, m): NEXT m: NEXT nπFOR n = 1 TO 255: OUT &H3C8, n: FOR m = 0 TO 2: OUT &H3C9, c(n, m): NEXT m: NEXT nπLOOPππRyan White                     FLYING BEES #2                 BIGFOOT@SunBelt.Net            09-06-96 (12:31)       QB, QBasic, PDS        131  4288     FLYBEES2.BASDECLARE SUB wasp (wx%(), wy%())πDECLARE SUB bees (wx%(), wy%(), x%(), y%(), xv%(), yv%(), bcolor%)πDEFINT A-ZπCOMMON SHARED winW, winH, winX, winY, border, NoBees, smoothππ'Flybees #2π'By Ryan White    Original source by Richard Daleπ'This is a sample of my abilities with palettes and wierd designs.π'If you would like to get more of these type programs, write me atπ'Bigfoot@Sunbelt.Net  or  Bigfoot@InfoAve.Netπ'I have more than 575 Qbasic programs to my name, and it grows daily.π'Ah well, enjoy...ππ'Just mess with it to learn.  I just thought his was neat enough to maybe beπ'cooler.   It was.πππON KEY(1) GOSUB cle: KEY(1) ONπON KEY(2) GOSUB ss: KEY(2) ONπON KEY(3) GOSUB smoothhuh: KEY(3) ONππDEFLNG T: CLSππNoBees = 40ππSCREEN 12: RANDOMIZE TIMER: CLSπGOSUB ssπDIM wx(0 TO 2), wy(0 TO 2), co(15, 2), cn(15, 2)πDIM x(0 TO 2, 1 TO NoBees): DIM y(0 TO 2, 1 TO NoBees)πDIM xv(1 TO NoBees): DIM yv(1 TO NoBees)πwinW = 0: winH = 0: winX = 0: winY = 0: maxx = 640: maxy = 480π' wasp will not go closer than this to the edgesπ    border = INT(RND * 75): winW = maxx: winH = maxyπ' Initialize the waspπ    wx(0) = 640 / 2: wy(0) = 480 / 2: wx(1) = wx(0): wy(1) = wy(0)π'Initialize the beesπ    FOR b = 1 TO NoBeesπ        x(0, b) = INT(RND * winW): x(1, b) = x(0, b)π        y(0, b) = INT(RND * winH): y(1, b) = y(0, b)π        xv(b) = 7 * (RND - .5): yv(b) = 7 * (RND - .5)π    NEXT bπ    DO UNTIL INKEY$ <> ""π    CALL wasp(wx(), wy()): CALL bees(wx(), wy(), x(), y(), xv(), yv(), bcolor)π    GOSUB dinπ    bcolor = bcolor + 1π    IF bcolor = 15 THEN bcolor = 1π    LOOP: SCREEN 0πENDππcle:πCLSπRETURNππss:πrr = INT(RND * 5): gr = INT(RND * 5): br = INT(RND * 5)πFOR n = 1 TO 14πOUT &H3C8, nπOUT &H3C9, n * rr + 3πOUT &H3C9, n * gr + 3πOUT &H3C9, n * br + 3πNEXT nπRETURNππdin:πFOR n = 14 TO 1 STEP -1: OUT &H3C7, n: FOR m = 0 TO 2: co(n, m) = INP(&H3C9): NEXT m: NEXT nπcn(1, 0) = co(14, 0): cn(1, 1) = co(14, 1): cn(1, 2) = co(14, 2)πFOR n = 14 TO 2 STEP -1: FOR m = 0 TO 2: cn(n, m) = co(n - 1, m): NEXT m: NEXT nπFOR n = 14 TO 1 STEP -1: OUT &H3C8, n: FOR m = 0 TO 2: OUT &H3C9, cn(n, m): NEXT m: NEXT nπRETURNππsmoothhuh:πsmooth = smooth - 1: IF smooth = -1 THEN smooth = 1πRETURNππDEFINT TπSUB bees (wx(), wy(), x(), y(), xv(), yv(), bcolor)π' Do not let things settle downπ    bb = INT(NoBees * RND + 1)π    xv(bb) = xv(bb) + (RND - .5) * 3: yv(bb) = yv(bb) + (RND - .5) * 3πFOR b = 1 TO NoBeesπ' Age position arraysπ    x(2, b) = x(1, b): y(2, b) = y(1, b)π    x(1, b) = x(0, b): y(1, b) = y(0, b)π    dx = wx(1) - x(1, b): dy = wy(1) - y(1, b)π    distance = ABS(dx) + ABS(dy)    ' Approximationπ    IF distance = 0 THEN distance = 1π    bee.acc = 3π' Accelerateπ    xv(b) = xv(b) + dx * bee.acc / distanceπ    yv(b) = yv(b) + dy * bee.acc / distanceπ    bee.vel = 11π' Speed Checksπ    IF xv(b) > bee.vel THEN xv(b) = bee.velπ    IF xv(b) < -bee.vel THEN xv(b) = -bee.velπ    IF yv(b) > bee.vel THEN yv(b) = bee.velπ    IF yv(b) < -bee.vel THEN yv(b) = -bee.velπ' Move the beesπ   IF smooth = 1 THEN       'non smoothπ        x(0, b) = x(1, b) + INT(RND * xv(b) + .25 * xv(b)): y(0, b) = y(1, b) + INT(RND * yv(b) + .25 * yv(b))π   END IFπ   IF smooth = 0 THEN      'smoothπ       x(0, b) = x(1, b) + xv(b): y(0, b) = y(1, b) + yv(b)π   END IFπ    LINE (x(0, b), y(0, b))-(x(1, b), y(1, b)), bcolorπ NEXT bπEND SUBππSUB wasp (wx(), wy()) STATICπ' Age the arraysπ    wx(2) = wx(1): wx(1) = wx(0): wy(2) = wy(1): wy(1) = wy(0)π' Accelerate (bias random variable to ensure wasp convers entire screen)π    wasp.acc = 5π    wxv = wxv + INT((RND - .4) * wasp.acc)π    wyv = wyv + INT((RND - .4) * wasp.acc)π' Speed limit checksπ    wxv.max = INT(RND * 30) + 20: wyv.max = INT(RND * 30) + 20π    IF wxv > wxv.max THEN wxv = wxv.maxπ    IF wxv < -wxv.max THEN wxv = -wxv.maxπ    IF wyv > wyv.max THEN wyv = wyv.maxπ    IF wyv < -wyv.max THEN wyv = -wyv.maxπ' Move waspπ    wx(0) = wx(1) + wxv: wy(0) = wy(1) + wyvπ' Bounce checksπ    IF wx(0) < border OR wx(0) > winW - border - 1 THENπ        wxv = -wxv: wx(0) = wx(0) + wxvπ    END IFπ    IF wy(0) < border OR wy(0) > winH - border - 1 THENπ        wyv = -wyv: wy(0) = wy(0) + wyvπ    END IFπEND SUBππRyan White                     FLYING BEES #8                 BIGFOOT@SunBelt.Net            09-06-96 (12:31)       QB, QBasic, PDS        135  4506     FLYBEES8.BASDECLARE SUB wasp (wx%(), wy%())πDECLARE SUB bees (wx%(), wy%(), x%(), y%(), xv%(), yv%(), bcolor%)πDEFINT A-ZπCOMMON SHARED winW, winH, winX, winY, border, NoBees, smoothππ'Flybees #8π'By Ryan White    Original source by Richard Daleπ'This is a sample of my abilities with palettes and wierd designs.π'If you would like to get more of these type programs, write me atπ'Bigfoot@Sunbelt.Net  or  Bigfoot@InfoAve.Netπ'I have more than 575 Qbasic programs to my name, and it grows daily.π'Ah well, enjoy...ππ'Just mess with it to learn.  I just thought his was neat enough to maybe beπ'cooler.   It was.ππππON KEY(1) GOSUB cle: KEY(1) ONπON KEY(2) GOSUB ss: KEY(2) ONπON KEY(3) GOSUB smoothhuh: KEY(3) ONππDEFLNG T: CLSππNoBees = 40ππSCREEN 12: RANDOMIZE TIMER: CLSπGOSUB ssπDIM wx(0 TO 2), wy(0 TO 2), co(15, 2), cn(15, 2)πDIM x(0 TO 2, 1 TO NoBees): DIM y(0 TO 2, 1 TO NoBees)πDIM xv(1 TO NoBees): DIM yv(1 TO NoBees)πwinW = 0: winH = 0: winX = 0: winY = 0: maxx = 640: maxy = 480π' wasp will not go closer than this to the edgesπ    border = INT(RND * 75): winW = maxx: winH = maxyπ' Initialize the waspπ    wx(0) = 640 / 2: wy(0) = 480 / 2: wx(1) = wx(0): wy(1) = wy(0)π'Initialize the beesπ    FOR b = 1 TO NoBeesπ        x(0, b) = INT(RND * winW): x(1, b) = x(0, b)π        y(0, b) = INT(RND * winH): y(1, b) = y(0, b)π        xv(b) = 7 * (RND - .5): yv(b) = 7 * (RND - .5)π    NEXT bπ    DO UNTIL INKEY$ <> ""π    CALL wasp(wx(), wy()): CALL bees(wx(), wy(), x(), y(), xv(), yv(), bcolor)π    GOSUB dinπ    bcolor = bcolor + 1π    IF bcolor = 15 THEN bcolor = 1π    LOOP: SCREEN 0πENDππcle:πCLSπRETURNππss:πrr = INT(RND * 5): gr = INT(RND * 5): br = INT(RND * 5)πFOR n = 1 TO 14πOUT &H3C8, nπOUT &H3C9, n * rr + 3πOUT &H3C9, n * gr + 3πOUT &H3C9, n * br + 3πNEXT nπRETURNππdin:πFOR n = 14 TO 1 STEP -1: OUT &H3C7, n: FOR m = 0 TO 2: co(n, m) = INP(&H3C9): NEXT m: NEXT nπcn(1, 0) = co(14, 0): cn(1, 1) = co(14, 1): cn(1, 2) = co(14, 2)πFOR n = 14 TO 2 STEP -1: FOR m = 0 TO 2: cn(n, m) = co(n - 1, m): NEXT m: NEXT nπFOR n = 14 TO 1 STEP -1: OUT &H3C8, n: FOR m = 0 TO 2: OUT &H3C9, cn(n, m): NEXT m: NEXT nπRETURNππsmoothhuh:πsmooth = smooth - 1: IF smooth = -1 THEN smooth = 1πRETURNππDEFINT TπSUB bees (wx(), wy(), x(), y(), xv(), yv(), bcolor)π' Do not let things settle downπ    bb = INT(NoBees * RND + 1)π    xv(bb) = xv(bb) + (RND - .5) * 3: yv(bb) = yv(bb) + (RND - .5) * 3πFOR b = 1 TO NoBeesπ' Age position arraysπ    x(2, b) = x(1, b): y(2, b) = y(1, b)π    x(1, b) = x(0, b): y(1, b) = y(0, b)π    dx = wx(1) - x(1, b): dy = wy(1) - y(1, b)π    distance = ABS(dx) + ABS(dy)    ' Approximationπ    IF distance = 0 THEN distance = 1π    bee.acc = 3π' Accelerateπ    xv(b) = xv(b) + dx * bee.acc / distanceπ    yv(b) = yv(b) + dy * bee.acc / distanceπ    bee.vel = 11π' Speed Checksπ    IF xv(b) > bee.vel THEN xv(b) = bee.velπ    IF xv(b) < -bee.vel THEN xv(b) = -bee.velπ    IF yv(b) > bee.vel THEN yv(b) = bee.velπ    IF yv(b) < -bee.vel THEN yv(b) = -bee.velπ' Move the beesπ   IF smooth = 1 THEN       'non smoothπ        x(0, b) = x(1, b) + INT(RND * xv(b) + .25 * xv(b)): y(0, b) = y(1, b) + INT(RND * yv(b) + .25 * yv(b))π   END IFπ   IF smooth = 0 THEN      'smoothπ       x(0, b) = x(1, b) + xv(b): y(0, b) = y(1, b) + yv(b)π   END IFπ    LINE (x(0, b), y(0, b))-(x(1, b), y(1, b)), bcolorπ    LINE (639 - x(0, b), y(0, b))-(639 - x(1, b), y(1, b)), bcolorπ    LINE (x(0, b), 479 - y(0, b))-(x(1, b), 479 - y(1, b)), bcolorπ    LINE (639 - x(0, b), 479 - y(0, b))-(639 - x(1, b), 479 - y(1, b)), bcolorπ NEXT bπEND SUBππSUB wasp (wx(), wy()) STATICπ' Age the arraysπ    wx(2) = wx(1): wx(1) = wx(0): wy(2) = wy(1): wy(1) = wy(0)π' Accelerate (bias random variable to ensure wasp convers entire screen)π    wasp.acc = 5π    wxv = wxv + INT((RND - .4) * wasp.acc)π    wyv = wyv + INT((RND - .4) * wasp.acc)π' Speed limit checksπ    wxv.max = INT(RND * 30) + 20: wyv.max = INT(RND * 30) + 20π    IF wxv > wxv.max THEN wxv = wxv.maxπ    IF wxv < -wxv.max THEN wxv = -wxv.maxπ    IF wyv > wyv.max THEN wyv = wyv.maxπ    IF wyv < -wyv.max THEN wyv = -wyv.maxπ' Move waspπ    wx(0) = wx(1) + wxv: wy(0) = wy(1) + wyvπ' Bounce checksπ    IF wx(0) < border OR wx(0) > winW - border - 1 THENπ        wxv = -wxv: wx(0) = wx(0) + wxvπ    END IFπ    IF wy(0) < border OR wy(0) > winH - border - 1 THENπ        wyv = -wyv: wy(0) = wy(0) + wyvπ    END IFπEND SUBππRyan White                     FLYING BEES #9                 BIGFOOT@SunBelt.Net            09-06-96 (12:31)       QB, QBasic, PDS        142  4593     FLYBEES9.BASDECLARE SUB wasp (wx%(), wy%())πDECLARE SUB bees (wx%(), wy%(), x%(), y%(), xv%(), yv%(), bcolor%)ππ'Flybees #9π'By Ryan White    Original source by Richard Daleπ'This is a sample of my abilities with palettes and wierd designs.π'If you would like to get more of these type programs, write me atπ'Bigfoot@Sunbelt.Net  or  Bigfoot@InfoAve.Netπ'I have more than 575 Qbasic programs to my name, and it grows daily.π'Ah well, enjoy...ππ'Just mess with it to learn.  I just thought his was neat enough to maybe beπ'cooler.   It was.ππDEFINT A-ZπCOMMON SHARED winW, winH, winX, winY, border, NoBees, smoothππON KEY(1) GOSUB cle: KEY(1) ONπON KEY(2) GOSUB ss: KEY(2) ONπON KEY(3) GOSUB smoothhuh: KEY(3) ONππDEFLNG T: CLSππNoBees = 1ππSCREEN 12: RANDOMIZE TIMER: CLSπGOSUB ssπDIM wx(0 TO 2), wy(0 TO 2), co(15, 2), cn(15, 2)πDIM x(0 TO 2, 1 TO NoBees): DIM y(0 TO 2, 1 TO NoBees)πDIM xv(1 TO NoBees): DIM yv(1 TO NoBees)πwinW = 0: winH = 0: winX = 0: winY = 0: maxx = 640: maxy = 480π' wasp will not go closer than this to the edgesπ    border = INT(RND * 75): winW = maxx: winH = maxyπ' Initialize the waspπ    wx(0) = 640 / 2: wy(0) = 480 / 2: wx(1) = wx(0): wy(1) = wy(0)π'Initialize the beesπ    FOR b = 1 TO NoBeesπ        x(0, b) = INT(RND * winW): x(1, b) = x(0, b)π        y(0, b) = INT(RND * winH): y(1, b) = y(0, b)π        xv(b) = 7 * (RND - .5): yv(b) = 7 * (RND - .5)π    NEXT bπ    DO UNTIL INKEY$ <> ""π    CALL wasp(wx(), wy()): CALL bees(wx(), wy(), x(), y(), xv(), yv(), bcolor)π    GOSUB dinπ    bcolor = bcolor + 1π    IF bcolor = 15 THEN bcolor = 1π    LOOP: SCREEN 0πENDππcle:πCLSπRETURNππss:πrr = INT(RND * 5): gr = INT(RND * 5): br = INT(RND * 5)πFOR n = 1 TO 14πOUT &H3C8, nπOUT &H3C9, n * rr + 3πOUT &H3C9, n * gr + 3πOUT &H3C9, n * br + 3πNEXT nπRETURNππdin:πFOR n = 14 TO 1 STEP -1: OUT &H3C7, n: FOR m = 0 TO 2: co(n, m) = INP(&H3C9): NEXT m: NEXT nπcn(1, 0) = co(14, 0): cn(1, 1) = co(14, 1): cn(1, 2) = co(14, 2)πFOR n = 14 TO 2 STEP -1: FOR m = 0 TO 2: cn(n, m) = co(n - 1, m): NEXT m: NEXT nπFOR n = 14 TO 1 STEP -1: OUT &H3C8, n: FOR m = 0 TO 2: OUT &H3C9, cn(n, m): NEXT m: NEXT nπRETURNππsmoothhuh:πsmooth = smooth - 1: IF smooth = -1 THEN smooth = 1πRETURNππDEFINT TπSUB bees (wx(), wy(), x(), y(), xv(), yv(), bcolor)π' Do not let things settle downπ    bb = INT(NoBees * RND + 1)π    xv(bb) = xv(bb) + (RND - .5) * 3: yv(bb) = yv(bb) + (RND - .5) * 3πFOR b = 1 TO NoBeesπ' Age position arraysπ    x(2, b) = x(1, b): y(2, b) = y(1, b)π    x(1, b) = x(0, b): y(1, b) = y(0, b)π    dx = wx(1) - x(1, b): dy = wy(1) - y(1, b)π    distance = ABS(dx) + ABS(dy)    ' Approximationπ    IF distance = 0 THEN distance = 1π    bee.acc = 3π' Accelerateπ    xv(b) = xv(b) + dx * bee.acc / distanceπ    yv(b) = yv(b) + dy * bee.acc / distanceπ    bee.vel = 11π' Speed Checksπ    IF xv(b) > bee.vel THEN xv(b) = bee.velπ    IF xv(b) < -bee.vel THEN xv(b) = -bee.velπ    IF yv(b) > bee.vel THEN yv(b) = bee.velπ    IF yv(b) < -bee.vel THEN yv(b) = -bee.velπ' Move the beesπ   IF smooth = 1 THEN       'non smoothπ        x(0, b) = x(1, b) + INT(RND * xv(b) + .25 * xv(b)): y(0, b) = y(1, b) + INT(RND * yv(b) + .25 * yv(b))π   END IFπ   IF smooth = 0 THEN      'smoothπ       x(0, b) = x(1, b) + xv(b): y(0, b) = y(1, b) + yv(b)π   END IFπ    FOR sx = 0 TO 639 STEP 25π    LINE (x(1, b), y(0, b))-(sx, 0), bcolorπ    NEXT sxπ    FOR sy = 0 TO 479 STEP 25π    LINE (x(1, b), y(0, b))-(639, sy), bcolorπ    NEXT syπ    FOR sx = 639 TO 0 STEP -25π    LINE (x(1, b), y(0, b))-(sx, 479), bcolorπ    NEXT sxπ    FOR sy = 479 TO 0 STEP -25π    LINE (x(1, b), y(0, b))-(0, sy), bcolorπ    NEXT syπ NEXT bπEND SUBππSUB wasp (wx(), wy()) STATICπ' Age the arraysπ    wx(2) = wx(1): wx(1) = wx(0): wy(2) = wy(1): wy(1) = wy(0)π' Accelerate (bias random variable to ensure wasp convers entire screen)π    wasp.acc = 5π    wxv = wxv + INT((RND - .4) * wasp.acc)π    wyv = wyv + INT((RND - .4) * wasp.acc)π' Speed limit checksπ    wxv.max = INT(RND * 30) + 20: wyv.max = INT(RND * 30) + 20π    IF wxv > wxv.max THEN wxv = wxv.maxπ    IF wxv < -wxv.max THEN wxv = -wxv.maxπ    IF wyv > wyv.max THEN wyv = wyv.maxπ    IF wyv < -wyv.max THEN wyv = -wyv.maxπ' Move waspπ    wx(0) = wx(1) + wxv: wy(0) = wy(1) + wyvπ' Bounce checksπ    IF wx(0) < border OR wx(0) > winW - border - 1 THENπ        wxv = -wxv: wx(0) = wx(0) + wxvπ    END IFπ    IF wy(0) < border OR wy(0) > winH - border - 1 THENπ        wyv = -wyv: wy(0) = wy(0) + wyvπ    END IFπEND SUBππRyan White                     GEOMETRY SICKENER              BIGFOOT@SunBelt.Net            09-06-96 (12:31)       QB, QBasic, PDS        87   2422     GEOMSICK.BAS'GEOMETRY SICKENERπ'By Ryan Whiteπ'This is a sample of my abilities with palettes and wierd designs.π'If you would like to get more of these type programs, write me atπ'Bigfoot@Sunbelt.Net  or  Bigfoot@InfoAve.Netπ'I have more than 575 Qbasic programs to my name, and it grows daily.π'Ah well, enjoy...ππSCREEN 12πDEFINT A-ZπCLSπRANDOMIZE TIMERπpnts = 6πDIM x(pnts), y(pnts), xc(pnts), yc(pnts), xb(pnts), yb(pnts), co(15, 2), cn(15, 2)πON KEY(1) GOSUB tt: KEY(1) ON       'Change colorsπON KEY(2) GOSUB makepoints: KEY(2) ON      'redo pointsπON KEY(3) GOSUB clrdescrn: KEY(3) ON          'clear screenππGOSUB ttπGOSUB makepointsππst:πGOSUB dolineπCLSπDO UNTIL INKEY$ <> ""πGOSUB bounce: GOSUB doline: cx = cx + 1: IF cx = 5 THEN cx = 0: GOSUB colorpuller  ': GOSUB doline0πLOOPπGOSUB daendππdoline:πc = c + 1: IF c = 16 THEN c = 1πm = pnts - 1: o = pntsπDO UNTIL o = 0πLINE (x(o), y(o))-(x(m), y(m)), cπm = m - 1: IF m = -1 THEN o = o - 1: m = o - 1πLOOPπRETURNππclrdescrn:πCLSπRETURNππmakepoints:πFOR n = 0 TO pntsπ x(n) = INT(RND * 640): y(n) = INT(RND * 480): xb(n) = 1: yb(n) = 1πNEXT nπRETURNππdoline0:πm = pnts - 1: o = pntsπDO UNTIL o = 0πLINE (x(o), y(o))-(x(m), y(m)), 0πm = m - 1: IF m = -1 THEN o = o - 1: m = o - 1πLOOPπRETURNππbounce:πFOR m = 0 TO pntsπIF x(m) >= 639 THEN xc(m) = 1: xb = INT(RND * 8)πIF x(m) <= 0 THEN xc(m) = 0: xb = INT(RND * 8)πIF y(m) >= 479 THEN yc(m) = 1: yb = INT(RND * 6)πIF y(m) <= 0 THEN yc(m) = 0: yb = INT(RND * 6)πIF xc(m) = 1 THEN x(m) = x(m) - xb(m) ELSE x(m) = x(m) + xb(m)πIF yc(m) = 1 THEN y(m) = y(m) - yb(m) ELSE y(m) = y(m) + yb(m)πNEXT mπRETURNππdaend:πCLS : SCREEN 0: WIDTH 80, 25: ENDππtt:πr = INT(RND * 5): g = INT(RND * 5): b = INT(RND * 5)πFOR attr% = 1 TO 15πrt% = attr% * r + 3: gt% = attr% * g + 3: bt% = attr% * b + 3πco(attr%, 0) = rt%: co(attr%, 1) = gt%: co(attr%, 2) = bt%πcn(attr%, 0) = rt%: cn(attr%, 1) = gt%: cn(attr%, 2) = bt%πOUT &H3C8, attr%: OUT &H3C9, rt%: OUT &H3C9, gt%: OUT &H3C9, bt%πNEXT attr%πRETURNππcolorpuller:πFOR n = 15 TO 1 STEP -1: OUT &H3C7, n: FOR m = 0 TO 2: co(n, m) = INP(&H3C9): NEXT m: NEXT nπcn(1, 0) = co(15, 0): cn(1, 1) = co(15, 1): cn(1, 2) = co(15, 2)πFOR n = 15 TO 2 STEP -1: FOR m = 0 TO 2: cn(n, m) = co(n - 1, m): NEXT m: NEXT nπFOR n = 15 TO 1 STEP -1: OUT &H3C8, n: FOR m = 0 TO 2: OUT &H3C9, cn(n, m): NEXT m: NEXT nπRETURNππRyan White                     GEOMETRY SICKER                BIGFOOT@SunBelt.Net            09-06-96 (12:31)       QB, QBasic, PDS        93   2582     GEOMSCKR.BAS'Geometry Sickerπ'By Ryan Whiteπ'This is a sample of my abilities with palettes and wierd designs.π'If you would like to get more of these type programs, write me atπ'Bigfoot@Sunbelt.Net  or  Bigfoot@InfoAve.Netπ'I have more than 575 Qbasic programs to my name, and it grows daily.π'Ah well, enjoy...ππ'This is simply a neater? version of Geometry SicknessπππSCREEN 12πDEFINT A-ZπCLSπRANDOMIZE TIMERπpnts = 3        '# or points -1πDIM x(pnts), y(pnts), xc(pnts), yc(pnts), xb(pnts), yb(pnts), co(15, 2), cn(15, 2)πON KEY(1) GOSUB tt: KEY(1) ONπON KEY(2) GOSUB makepoints: KEY(2) ONπON KEY(3) GOSUB clrdescrn: KEY(3) ONπWINDOW (0, 0)-(639, 639)πGOSUB ttπGOSUB makepointsππst:πGOSUB dolineπCLSπDO UNTIL INKEY$ <> ""πGOSUB bounce: GOSUB doline: GOSUB colorpuller  ': GOSUB doline0πLOOPπGOSUB daendππdoline:πc = c + 1: IF c = 16 THEN c = 1πm = pnts - 1: o = pntsπDO UNTIL o = 0πLINE (x(o), y(o))-(x(m), y(m)), cπLINE (639 - x(o), y(o))-(639 - x(m), y(m)), cπLINE (x(o), 639 - y(o))-(x(m), 639 - y(m)), cπLINE (639 - x(o), 639 - y(o))-(639 - x(m), 639 - y(m)), cπm = m - 1: IF m = -1 THEN o = o - 1: m = o - 1πLOOPπRETURNππclrdescrn:πCLSπRETURNππmakepoints:πFOR n = 0 TO pntsπ x(n) = INT(RND * 640): y(n) = INT(RND * 640): xb(n) = 1: yb(n) = 1πNEXT nπRETURNππdoline0:πm = pnts - 1: o = pntsπDO UNTIL o = 0πLINE (x(o), y(o))-(x(m), y(m)), 0πm = m - 1: IF m = -1 THEN o = o - 1: m = o - 1πLOOPπRETURNππbounce:πFOR m = 0 TO pntsπIF x(m) >= 639 THEN xc(m) = 1: xb = INT(RND * 8)πIF x(m) <= 0 THEN xc(m) = 0: xb = INT(RND * 8)πIF y(m) >= 639 THEN yc(m) = 1: yb = INT(RND * 6)πIF y(m) <= 0 THEN yc(m) = 0: yb = INT(RND * 6)πIF xc(m) = 1 THEN x(m) = x(m) - xb(m) ELSE x(m) = x(m) + xb(m)πIF yc(m) = 1 THEN y(m) = y(m) - yb(m) ELSE y(m) = y(m) + yb(m)πNEXT mπRETURNππdaend:πCLS : SCREEN 0: WIDTH 80, 25: ENDππtt:πr = INT(RND * 5): g = INT(RND * 5): b = INT(RND * 5)πFOR attr% = 1 TO 15πrt% = attr% * r + 3: gt% = attr% * g + 3: bt% = attr% * b + 3πco(attr%, 0) = rt%: co(attr%, 1) = gt%: co(attr%, 2) = bt%πcn(attr%, 0) = rt%: cn(attr%, 1) = gt%: cn(attr%, 2) = bt%πOUT &H3C8, attr%: OUT &H3C9, rt%: OUT &H3C9, gt%: OUT &H3C9, bt%πNEXT attr%πRETURNππcolorpuller:πFOR n = 15 TO 1 STEP -1: OUT &H3C7, n: FOR m = 0 TO 2: co(n, m) = INP(&H3C9): NEXT m: NEXT nπcn(1, 0) = co(15, 0): cn(1, 1) = co(15, 1): cn(1, 2) = co(15, 2)πFOR n = 15 TO 2 STEP -1: FOR m = 0 TO 2: cn(n, m) = co(n - 1, m): NEXT m: NEXT nπFOR n = 15 TO 1 STEP -1: OUT &H3C8, n: FOR m = 0 TO 2: OUT &H3C9, cn(n, m): NEXT m: NEXT nπRETURNππNathan Wittich                 3D GRAPHS                      wittich@cdsnet.net             09-18-96 (18:27)       QB, QBasic, PDS        82   2523     3DGRAPH.BAS ' 3dgraphπ' a cool screensaver by Nathan Wittichπ' wittich@cdsnet.net in subject put in "Nathan:" someone else is inπ' an email based newsgroup that I share internet access with.π'π' This program draws new 3d graphs on the screen. Each one is differentπ' in colors, sizes, smoothness, and how high the bumps are. My goalπ' when I made it was to make each one as different as I can, not justπ' different graphs that look alikeπ'π' here's how it makes the graph:π' A dimmensioned variable (u) has all the gridsπ' Into each place, it puts a random number.π' it averages each grid's height with the heights of surrounding ones.π' It does that lots of times.π' Then it draws the graphπ'π' Although random #'s make each different, changing the source code willπ' be even better.π'π' How come in basic I can make a cooler screensaver than Microsuck?π'ππRANDOMIZE TIMERπDEFINT A-ZπDIM u(75, 60)πSCREEN 12πDOπc1 = RND * 8πc2 = RND * 8πc3 = RND * 8π'PRINT "palette"πFOR a = 1 TO 14π'PALETTE a, a * 4πNEXT aπ'PRINT "setting up"πl1 = RND * 500πl2 = l1 + RND * 500πFOR a = 1 TO 64πFOR b = 1 TO 48πu(a, b) = (u(a, b) * .9) + RND * l1 - RND * l1πIF RND < .01 THEN u(a, b) = l2 * RNDπNEXT bπNEXT aπ'FOR a = 55 TO 64π'FOR b = 5 TO 43π'u(a, b) = (u(a - 1, b) - 10)π'NEXT bπ'NEXT aπFOR i = 1 TO 4 + RND * 2πLOCATE 3, 1π'PRINT "smoothening "; INT((i / 7) * 100); "%"πFOR a = 2 TO 64 'smoothen itπFOR b = 2 TO 48πu(a, b) = (u(a + 1, b) + u(a - 1, b) + u(a, b - 1) + u(a, b + 1) + u(a, b + 2) + u(a + 2, b)) / 6πNEXT bπNEXT aπNEXT iπ'FOR i = 1 TO 2π'FOR a = -480 + RND + RND + RND TO 640 STEP 2 + RND * 3π'LINE (640 - a, 0)-(640 - a - 480, 480), 0π'LINE (a, 0)-(a + 480, 480), 0π'NEXT aπ'NEXTπCLSπ'd = 1πn = RND * 10 + RND * 10πFOR a = 60 TO 2 STEP -1πFOR b = 2 TO 45πIF ABS(a - b) < 35 AND (a + b) > 15 AND a > 5 AND b > 5 THENπ        'SWAP d, eπ        'LINE (a * n + u(a, b), b * n - u(a, b))-(a * n + u(a - 1, b + 1) - n, n + b * n - u(a - 1, b + 1)),RND * 16, BFπ        LINE (a * n + u(a, b), b * n - u(a, b))-(a * n + u(a + 1, b + 1) + n, n + b * n - u(a + 1, b + 1)),c1π        'LINE (a * n + u(a, b), b * n - u(a, b + 1) + n)-(a * n + n + u(a + 1, b), b * n - u(a + 1, b)), c1π        LINE (a * n + u(a, b), b * n - u(a, b))-(a * n + u(a + 1, b) + n, b * n - u(a + 1, b)), c2π        LINE (a * n + u(a, b), b * n - u(a, b))-(a * n + u(a, b + 1), b * n + n - u(a, b + 1)), c3π        END IFπNEXT bπSWAP d, eπNEXT aπ'a$ = INPUT$(1)πLOOP WHILE INKEY$ = ""πJames N. Broadbent             DEMO OF REAL-TIME GRAPHING     FidoNet QUIK_BAS Echo          05-17-96 (00:00)       QB, QBasic, PDS        290  9419     GRAPHING.BAS' > I am trying to figure out a way to put some graphic onto theπ' > screen instataneously.  I'm sure you have played DOOM or Wolf-3Dππ'I'm a Descent into Saturn fan myselfππ' > before, or at least looked at it.  I don't know how manyπ' > frames-per-second those games display, but it is awfully smooth.  Isπ' > there any way to get smooth graphics like that in QuickBASIC?ππ'I feel like taking a scene from "Wayne's World" and bowing down to these π'people saying "We're not worthy....We're not worthy!!!"  :-)ππ'Truly I don't think that kind of graphics is possible in Qb 4.5. It astounds π'me how they can control the motion of robots, missles and screnery so π'smoothly. I have trouble with just a couple of simple elementsπ π' -> If it is trying to graph realtime data, I may be able toπ' -> help you. I have recently worked on a realtime graphicalπ' -> display of 2 values being updated every 0.2 seconds usingπ' -> PSET, VIEW, and WINDOW.ππ' > Do you have any code that you might be able to post in here?ππ'Sure!...<...>ππ'The purpose of this routine is to give a graphic visual display of incoming π'data from 2 COM ports. I have simulated this a simple random number routine π'for each variable.π π'It probably could be improved a bit since I don't put the values for the majorπ'Y-axis tick marks. But they aren't really necessary for what I was doing.π π'Hope you like it....look forward to your comments.π π'Regards Jimππ'       **************************************************************π'       ***   Demonstration of real-time graphing of 2 parameters  ***π'       ***              with time on the X-axis                   ***π'       ***                                                        ***π'       ***              by   James N. Broadbent                   ***π'       ***                    May 17, 1996                        ***π'       **************************************************************ππSCREEN 12πDIM YGRAPH!(8, 2)ππ'       YGRAPH!(8,2)  is the matrix that holds the vales that make upπ'                     the Y-axis for the 3 "ZOOM" levels.π'       "ZOOM" levels are magnification levels of full scale on theπ'                     Y-axis. They can be any ratio desired but in thisπ'                     example the ZOOMFACTORS are 100%, 200% and 400%π'                     magnification.ππ'       NOTE: This is not a general graphing routine but will haveπ'             a min "Y" value set to 0.0 and max "Y" value of 100000πSTART:π        CLSπ        LOCATE 9, 20π        LINE INPUT "Enter the Maximum Value for Y-axis: "; a$π        IF VAL(a$) <= 0! OR VAL(a$) > 100000 THENπ           LOCATE 11, 20π           BEEPπ           PRINT "Please enter a number from 0 to 100,000!"π           SLEEP 1π           GOTO STARTπ           END IFπ        MAXY! = VAL(a$)ππ'       Graph co-ordinates for ZOOM feature and drawing the Y-axisππ'       set min and max for window statement for each zoom levelπ        YGRAPH!(0, 0) = MAXY! * 1.05π        YGRAPH!(0, 1) = MAXY! * 1.05 / 2π        YGRAPH!(0, 2) = MAXY! * 1.05 / 4π        YGRAPH!(1, 0) = -.05 * MAXY!π        YGRAPH!(1, 1) = -.05 * MAXY! / 2π        YGRAPH!(1, 2) = -.05 * MAXY! / 4π      π'       set Y-axis and X-axis overall coordinatesπ        FOR i% = 0 TO 2π           YGRAPH!(2, i%) = YGRAPH!(1, i%) * .95π        NEXT i%π       π'       set major Y-axis tick marksπ        k! = 1.25π        FOR j% = 3 TO 7π           k! = k! - .25π           FOR i% = 0 TO 2π              l% = i% ^ 2 + 1π              IF l% = 5 THEN l% = 4π              YGRAPH!(j%, i%) = MAXY! * k! / l%π           NEXT i%π        NEXT j%ππ'       Bottom screen clearing coordinatesπ        YGRAPH!(8, 0) = -.045 * MAXY!π        YGRAPH!(8, 1) = -.045 * MAXY! / 2π        YGRAPH!(8, 2) = -.045 * MAXY! / 4ππ'       Create the viewport for the Graphπ        VIEW (1, 100)-(637, 440), 1, 9ππ'       set up the initial graphπ        z% = 0                       ' ZOOMFACTOR elementπ        GOSUB graphcoordinatesπ        COLOR 14π        LOCATE 1, 10π        PRINT "Demonstration of a Continuous Real-Time Plot of 2 Variables";π        LOCATE 2, 30π        PRINT "by James N. Broadbent"π        ZF% = z% ^ 2 + 100π        IF ZF% > 450 THEN ZF% = 400π        r! = MAXY! / ZF% * 100π        COLOR 11π        LOCATE 4, 5π        PRINT "Y - Axis Range : 0 to"; r!; " units"π        COLOR 3π        LOCATE 5, 5π        PRINT "ZOOM Factor (%):"; ZF%π        COLOR 13π        LOCATE 4, 50π        PRINT "Value of Variable #1:";π        COLOR 15π        LOCATE 5, 50π        PRINT "Value of Variable #2:";π        LOCATE 29, 5π        PRINT "Press <X> to Exit";π        LOCATE 29, 57π        PRINT "Press <Z> to ZOOM";π        COLOR 14π        LOCATE 29, 34π        PRINT "TIME (SECS):";ππ'      initialize these following parameters for real-time graphπ       X! = -1                         ' X axis data positionπ       STARTTIME! = TIMER              ' for time display = 0π       TRIGGER! = TIMER                ' to trigger data displayπ       π'       Generate simulated values and plot to the screenππ       DOπ          a$ = UCASE$(INKEY$)π          IF TIMER - TRIGGER! > .2 THENπ             GOSUB YDATAπ             TRIGGER! = TIMERπ             COLOR 14π             LOCATE 29, 46π             PRINT INT(TIMER - STARTTIME);π             IF TIMER - STARTIME > 99999 THEN STARTIME = TIMERπ             END IFπ          IF a$ = "Z" THENπ             z% = z% + 1π             SELECT CASE z%π                CASE 0π                   ZF% = 100π                CASE 1π                   ZF% = 200π                CASE 2π                   ZF% = 400π                CASE 3π                   ZF% = 100π                   z% = 0π             END SELECTππ          r! = MAXY! / ZF% * 100π          COLOR 11π          LOCATE 4, 5π          PRINT SPC(35);π          LOCATE 4, 5π          PRINT "Y - Axis Range : 0 to"; r!; " units";π          VIEW (1, 100)-(637, 440), 1, 9π          GOSUB graphcoordinatesπ          COLOR 3π          LOCATE 5, 22π          COLOR 13π          PRINT ZF%;  ' Display the ZOOMπ          END IFππ       LOOP WHILE a$ <> "X"ππ       VIEWπ       CLS 0π       COLOR 15π       LOCATE 9, 29π       PRINT "Start again (Y/N)?"π       DOπ          a$ = UCASE$(INKEY$)π          IF a$ = "Y" THEN GOTO STARTπ          IF a$ = "N" THEN ENDπ       LOOPππgraphcoordinates:ππ'       Set up Graph coordinatesππ       WINDOW (-15, YGRAPH!(1, z%))-(620, YGRAPH!(0, z%))π       LINE (-8, YGRAPH!(2, z%))-(600, YGRAPH!(2, z%)), 11π       LINE (-5, YGRAPH!(3, z%))-(-5, YGRAPH!(1, z%)), 11π       LINE (-10, YGRAPH!(3, z%))-(-5, YGRAPH!(3, z%)), 11π       LINE (-7, YGRAPH!(4, z%))-(-5, YGRAPH!(4, z%)), 11π       LINE (-10, YGRAPH!(5, z%))-(-5, YGRAPH!(5, z%)), 11π       LINE (-7, YGRAPH!(6, z%))-(-5, YGRAPH!(6, z%)), 11ππ'      Next line is the "TICK" indicating ZEROπ       LINE (-10, YGRAPH!(7, z%))-(-5, YGRAPH!(7, z%)), 13ππ       RETURNππYDATA:ππ'       Generate simulated vales for variables 1 and 2ππ       IY1! = (MAXY! * RND(1) - MAXY! / 2) * .1π       IY2! = (MAXY! * RND(1) - MAXY! / 2) * .1π       IF Y1! + IY1! > MAXY! OR Y1! + IY1! < 0 THENπ          Y1! = Y1! - IY1!π          ELSEπ          Y1! = Y1! + IY1!π          END IFπ       IF Y2! + IY2! > MAXY! OR Y2! + IY2! < 0 THENπ          Y2! = Y2! - IY2!π          ELSEπ          Y2! = Y2! + IY2!π          END IFπ       LOCATE 4, 72π       PRINT "       ";π       LOCATE 5, 72π       PRINT "       ";π       SELECT CASE MAXY!π          CASE IS > 10000π             COLOR 13π             LOCATE 4, 72π             PRINT USING "#####"; Y1!π             COLOR 15π             LOCATE 5, 72π             PRINT USING "#####"; Y2!π          CASE 1000 TO 9999π             COLOR 13π             LOCATE 4, 72π             PRINT USING "####.#"; Y1!π             COLOR 15π             LOCATE 5, 72π             PRINT USING "######.#"; Y2!π          CASE 100 TO 999π             COLOR 13π             LOCATE 4, 72π             PRINT USING "###.##"; Y1!π             COLOR 15π             LOCATE 5, 72π             PRINT USING "###.##"; Y2!π          CASE 10 TO 99π             COLOR 13π             LOCATE 4, 72π             PRINT USING "##.###"; Y1!π             COLOR 15π             LOCATE 5, 72π             PRINT USING "##.###"; Y2!π          CASE 1! TO 9.9π             COLOR 13π             LOCATE 4, 72π             PRINT USING "#.####"; Y1!π             COLOR 15π             LOCATE 5, 72π             PRINT USING "#.####"; Y2!π       END SELECTπ       X! = X! + 1π       π'       plotting the variable values      π       IF X! > 600 THENπ          X! = 0π          PSET (X!, Y1!), 13π          PSET (X!, Y2!), 15π          ELSEπ          LINE (X! - 1, LY1!)-(X!, Y1!), 13π          LINE (X! - 1, LY2!)-(X!, Y2!), 15π       END IFπ       π'       compute and establish data clearing block           π       π       IF X! > 559 THENπ          XL! = X! - 560π          ELSEπ          XL! = X! + 41π          END IFπ       LINE (XL! - 1, YGRAPH!(8, z%))-(XL! + 1, YGRAPH!(0, z%)), 1, BFπ       π'       save last values of each variable          π       LY1! = Y1!: LY2! = Y2!π       RETURNπRyan White                     SPIRALING MIND KNOCKER         BIGFOOT@InfoAve.Net            09-21-96 (17:53)       QB, QBasic, PDS        74   2707     SPIRALER.BAS'sPiRaLiNg MiNd KnOcKeR 1π'By Ryan Whiteπ'Look at it for a while then look awayπ'Edit anyway you wantππON KEY(1) GOSUB st: KEY(1) ONπSCREEN 13πCLSππ     'rozeπ'FOR x = 180 TO 1 STEP -.5π'z = 159 + x * COS(x):y = 99 + x * SIN(x)π'FOR r = 15 TO 0 STEP -1π'c = c + 1: IF c = 16 THEN c = 1π'LINE (z - r, y - r)-(z + r, y + r), c, Bπ'NEXT r: NEXT xππ      'Webzπ'FOR x = 180 TO 1 STEP -.05π'z = 159 + x * COS(x): y = 99 + x * SIN(x)π'c = c + 1: IF c = 16 THEN c = 1π'LINE (0, 0)-(z, y), c: LINE -(319, 0), c: LINE (319, 199)-(z, y), c: LINE -(0, 199), cπ'NEXT xπ      π       'Gemzπ'FOR x = 180 TO 1 STEP -.05π'z = 159 + x * COS(x): y = 99 + x * SIN(x)π'FOR r = 5 TO 1 STEP -1π'c = c + 1: IF c = 16 THEN c = 1π'FOR m = -1 TO 1: CIRCLE (z, y + m), r, c, , , 1: NEXT mπ'NEXT r: NEXT xππ      'X-pointsπFOR x = 180 TO 1 STEP -.05πz = 159 + x * COS(x)πy = 99 + x * SIN(x)πc = c + .1: IF c = 16 THEN c = 1πLINE (z - 2, y - 2)-(z, y), cπLINE -(z + 2, y - 2), cπLINE (z + 2, y + 2)-(z, y), cπLINE -(z - 2, y + 2), cπNEXT xππst:πDEFINT A-ZπDIM c(255, 2), co(255, 2)πFOR n = 0 TO 15π'black white red orange yellow green blue's purple ~then backwards~πc(n, 0) = n * 4: c(n, 1) = n * 4: c(n, 2) = n * 4πc(n + 16, 0) = 63: c(n + 16, 1) = 63 - n * 4: c(n + 16, 2) = 63 - n * 4πc(n + 32, 0) = 63: c(n + 32, 1) = n * 2: c(n + 32, 2) = 0πc(n + 48, 0) = 63: c(n + 48, 1) = n * 2 + 31: c(n + 48, 2) = 0πc(n + 64, 0) = 63 - n * 4: c(n + 64, 1) = 63: c(n + 64, 2) = 0πc(n + 80, 0) = 0: c(n + 80, 1) = 63 - n * 2: c(n + 80, 2) = n * 4πc(n + 96, 0) = 0: c(n + 96, 1) = 32 - n * 2: c(n + 96, 2) = 60πc(n + 112, 0) = n * 3: c(n + 112, 1) = 0: c(n + 112, 2) = 60πc(n + 128, 0) = 45 - n * 3: c(n + 128, 1) = 0: c(n + 128, 2) = 60πc(n + 144, 0) = 0: c(n + 144, 1) = n * 2: c(n + 144, 2) = 60πc(n + 160, 0) = 0: c(n + 160, 1) = 30 + n * 2: c(n + 160, 2) = 60 - n * 4πc(n + 176, 0) = n * 4: c(n + 176, 1) = 63: c(n + 176, 2) = 0πc(n + 192, 0) = 63: c(n + 192, 1) = 60 - n * 2: c(n + 192, 2) = 0πc(n + 208, 0) = 63: c(n + 208, 1) = 30 - n * 2: c(n + 208, 2) = 0πc(n + 224, 0) = 60 - n * 2: c(n + 224, 1) = n * 2: c(n + 224, 2) = n * 2πc(n + 240, 0) = 30 - n * 2: c(n + 240, 1) = 30 - n * 2: c(n + 240, 2) = 30 - n * 2πNEXT nπ'makes the colors appearπFOR n = 0 TO 255: OUT &H3C8, n: FOR m = 0 TO 2: OUT &H3C9, c(n, m): NEXT m: NEXT nππDO UNTIL INKEY$ <> ""πFOR n = 1 TO 255: OUT &H3C7, n: FOR m = 0 TO 2: co(n, m) = INP(&H3C9): NEXT m: NEXT nπc(255, 0) = co(1, 0): c(255, 1) = co(1, 1): c(255, 2) = co(1, 2)πFOR n = 1 TO 254: FOR m = 0 TO 2: c(n, m) = co(n + 1, m): NEXT m: NEXT nπFOR n = 1 TO 255: OUT &H3C8, n: FOR m = 0 TO 2: OUT &H3C9, c(n, m): NEXT m: NEXT nπLOOPπRyan White                     MULTI MORPH                    BIGFOOT@InfoAve.Net            09-21-96 (17:53)       QB, QBasic, PDS        89   2580     4XMORPH.BAS 'MultiMorphπ'By Ryan Whiteπ'Feel free to change, to love, to marriage.  NO COMPUTER SEX THOUGH!!!!π'I MADE THIS PROGRAM TO EDIT AND ENJOY, BUT NOT TO HAVE SEX WITH!!!!π'I'm SeRiOuS!ππSCREEN 13πCLSπRANDOMIZE TIMERπDEFINT A-ZπDIM cn(255, 2), co(255, 2)πVIEW (0, 0)-(319, 199)πFOR x = 0 TO 63πOUT &H3C8, x: OUT &H3C9, x: OUT &H3C9, 0: OUT &H3C9, 0πOUT &H3C8, x + 64: OUT &H3C9, 0: OUT &H3C9, x: OUT &H3C9, 0πOUT &H3C8, x + 128: OUT &H3C9, 0: OUT &H3C9, 0: OUT &H3C9, xπOUT &H3C8, x + 192: OUT &H3C9, 63 - x: OUT &H3C9, 63 - x: OUT &H3C9, 0πNEXT xππc = 0πFOR x = 0 TO 289 STEP 20: x2 = x + 20πFOR y = 0 TO 189 STEP 10: y2 = y + 10πFOR pnty = y TO y2πc = c + 1: IF c >= 64 THEN c = 0πLINE (x, pnty)-(x2, pnty), cπNEXT pntyπNEXT yπNEXT xππc = 64πFOR n = 1 TO 10πx = INT(RND * 280) + 20πy = INT(RND * 160) + 20πr = INT(RND * 20) + 10πFOR m = 1 TO rπc = c + 1: IF c >= 64 THEN c = 0πFOR o = -1 TO 1πCIRCLE (x, y + o), m, 127 - c, , , 1πNEXT oπNEXT mπNEXT nππc = 128ππFOR n = 1 TO 10πx = INT(RND * 299) + 1πy = INT(RND * 179) + 1πFOR r = 0 TO 20πc = c + 1: IF c >= 192 THEN c = 129πLINE (x - r, y - r)-(x + r, y + r), c, BπNEXT rπNEXT nππc = 255    'we are going in reverse this timeπx = 160: y = 100πFOR m = 1 TO 3500πPSET (x, y + 1), cπPSET (x, y), cπPSET (x, y - 1), cπPSET (x + 1, y + 1), cπPSET (x + 1, y), cπPSET (x + 1, y - 1), cπPSET (x - 1, y + 1), cπPSET (x - 1, y), cπPSET (x - 1, y - 1), cπc = c - 1: IF c <= 191 THEN c = 255πx = x + (INT((RND * 2) + 1) * 2 - 3)πy = y + (INT((RND * 2) + 1) * 2 - 3)πNEXT mππDO UNTIL INKEY$ <> ""π'read color valuesπFOR n = 0 TO 255: OUT &H3C7, n: FOR m = 0 TO 2: co(n, m) = INP(&H3C9): NEXT m: NEXT nπ'cycle last from first colorπcn(63, 0) = co(1, 0): cn(63, 1) = co(1, 1): cn(63, 2) = co(1, 2)πcn(127, 0) = co(64, 0): cn(127, 1) = co(64, 1): cn(127, 2) = co(64, 2)πcn(191, 0) = co(128, 0): cn(191, 1) = co(128, 1): cn(191, 2) = co(128, 2)πcn(255, 0) = co(192, 0): cn(255, 1) = co(192, 1): cn(255, 2) = co(192, 2)π'cycle the rest  170 length -==>πFOR n = 0 TO 62: FOR m = 0 TO 2πIF n <> 0 THEN cn(n, m) = co(n + 1, m)  'red not ok  I have to limit it to 63 colors becauseπIF n = 0 THEN cn(1, m) = co(n + 1, m)   'if 0 is messed with, then the border of the monitor goes *ukie*πcn(n + 64, m) = co(n + 65, m)           'green okπcn(n + 128, m) = co(n + 129, m)         'blue okπcn(n + 192, m) = co(n + 193, m)         'yellow okπNEXT m: NEXT nπ'write color to screenπFOR n = 0 TO 255: OUT &H3C8, n: FOR m = 0 TO 2: OUT &H3C9, cn(n, m): NEXT m: NEXT nπLOOPπPhillip Jay Cohen              OUTLINED FONTS                 cohennet@erols.com             09-29-96 (11:47)       QB, QBasic, PDS        128  6434     FONTS.BAS   π''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''π''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''π''''              Phillip Jay Cohen's Outlined Font Routines:             ''''π''''                          Demo Program                                ''''π''''                                                                      ''''π''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''π''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''ππ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''π''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''π''''  Everything appearing here in the main program is just demonstration ''''π'''' and won't be of any use to any of you (or at least I don't think so) ''''π'''' Besides, it's not hard to understand what's going on here, it's the  ''''π'''' actual routines that do most of the work. These are just calls, and  ''''π'''' a pretty border to keep us happy.  If you want to use these routines ''''π'''' you will somewhat need to understand how to call them.  Just run the ''''π'''' program to find out about the syntax and stuff, or if you are lazy,  ''''π'''' you can check directly in the code, but then you won't know how it   ''''π'''' looks.  The routines will only work in screen mode 13, as I am use-  ''''π'''' ing VGA video memory.  I will be very happy if you distribute these  ''''π'''' routines, and if you think they're useful or maybe you feel warm and ''''π'''' squooshy inside, then please  E-mail me and tell me.  My email is:   ''''π'''' cohennet@erols.com.  Thanks for taking time to read this. -- P.J.C.  ''''π''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''π''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''ππDEFINT A-Z   'Not neccessary, but it couldn't hurt to speed things up a bitππDECLARE SUB OFont (Text$, X, Y, Fore, Back)    'Main font routineπDECLARE SUB OCenter (Text$, Y, Fore, Back)     'Centering routineπDECLARE SUB PressAndClear ()                   'Waits for key pressππSCREEN 13    '320x200 VGA and MCGA screen modeππ             'None of the rest is important, it's just demonstrationπLINE (1, 0)-(318, 0), 4πLINE (0, 1)-(0, 198), 4πLINE (1, 199)-(318, 199), 4πLINE (319, 1)-(319, 198), 4πLINE (1, 1)-(318, 198), 41, BπLINE (2, 2)-(317, 197), 42, BπLINE (3, 3)-(316, 196), 14, BπPAINT (4, 4), 25, 14πOCenter "PHILLIP JAY COHEN'S", 10, 2, 144πOFont "OUTLINED FONT", 60, 25, 43, 114πOFont "DEMO PROGRAM", 180, 25, 32, 1πOCenter "Syntax:", 50, 15, 8πOCenter "OFont Text$, X, Y, Fore, Back", 65, 40, 4πOFont "Where:", 10, 85, 9, 33πOFont "Text$ = The text to be printed", 70, 85, 11, 3πOCenter "X = The horizontal coordinate for the", 100, 35, 5πOCenter "upper-left hand corner of the text", 110, 35, 5πOFont "Y = The vertical coordinate for the", 10, 125, 42, 41πOCenter "upper-left hand corner of the text", 135, 42, 41πOCenter "Fore = The text's foreground color", 150, 13, 37πOCenter "Back = The text's background color", 165, 44, 6πOCenter "PRESS A KEY", 185, 15, 8πPressAndClearπOCenter "Also Including", 50, 15, 8πOFont "A centering routine,", 25, 65, 40, 4πOFont "which has the", 190, 65, 11, 3πOCenter "same syntax, except for the X argument", 75, 11, 3πOCenter "These routines only work in screen", 90, 35, 5πOCenter "mode 13, but have many advantages,", 100, 35, 5πOCenter "Including:", 115, 44, 6πOCenter "Outlining (obviously), placement at", 130, 42, 41πOCenter "exact coordinates (unlike PRINT),", 140, 42, 41πOCenter "avoid erasing the background, and", 150, 42, 41πOCenter "are relatively FAST for QBasic", 160, 42, 41πOCenter "MORE -->", 173, 13, 37πPressAndClearπOCenter "Please,", 50, 15, 8πOCenter "Feel free to distribute these routines", 65, 40, 4πOCenter "Try to give me credit when you use", 80, 11, 3πOCenter "them, if you can (I don't think that's", 90, 11, 3πOCenter "asking too much, do you?)", 100, 11, 3πOCenter "Unless you have a lot of programing", 115, 9, 33πOCenter "experience, don't try to understand", 125, 9, 33πOCenter "the OFont routine; you don't need to", 135, 9, 33πOCenter "know how the routine works to use it", 145, 9, 33πOCenter "For more info, you can contact me at:", 160, 35, 5πOCenter "cohennet@erols.com", 173, 44, 6πPressAndClearπSCREEN 0πWIDTH 80πENDππSUB OCenter (Text$, Y, Fore, Back)πOFont Text$, 160 - INT(LEN(Text$) * 4), Y, Fore, Back 'Call with appropriateπEND SUB                                              'Starting X coordinateππSUB OFont (Text$, X, Y, Fore, Back)πDEF SEG = &HFFA6                              'Stores masks for lettersπFOR Letter = 1 TO LEN(Text$)                  'Does each letterπAddress = (8 * ASC(MID$(Text$, Letter))) + 14 'Address for start of letterπFOR Height = 0 TO 7                       'Each letter is an 8x8 pixel matrixπMask = PEEK(Address + Height) * 128   'Address for mask of each line of letterπLINE (X + Curntx + 1, Y + Height + 1)-(X + 9 + Curntx, Y + Height + 1), Fore, , MaskπNEXTπCurntx = Curntx + 8                   'Advances X axis by 8 for next letterπNEXT                                  'Continue to next letterπDEF SEG = &HA000                      'Change to video memoryπIF Back > 0 THEN                      'Background color can't be color 0πFOR V = Y TO Y + 7                    'Again, they're 8x8 pixelsπFOR H = X TO (LEN(Text$) * 8) - 1 + X 'Calculates length of text in pixelsπPK0& = PEEK(H + V * 320&)             'Is point at H,V = to foreground color?πPK1& = PEEK(H + 1 + (V + 1) * 320&)   'Is point at H+1, V+1 = to foreground?πPK2& = PEEK(H + 1 + V * 320&)         'Is point at H+1, V = to foreground?πPT& = H + V * 320&                    'Video memory pointerπIF PK0& <> Fore THEN                  'If this is foreground, don't overlap itπIF PK1& = Fore OR PK2& = Fore THEN POKE PT&, Back    'Put pixel into memoryπEND IFπNEXT H     'Next horizontalπNEXT V     'Next verticalπEND IFπDEF SEG    'Put us back whereπEND SUB    'We startedππSUB PressAndClearπBuffer = &H1AπDEF SEG = &H40πPOKE Buffer, PEEK(Buffer + 2)    'Clear keyboard bufferπDEF SEGπDO: LOOP WHILE INKEY$ = ""       'Wait for key pressπLINE (4, 45)-(315, 180), 25, BF  'Clear our working areaπEND SUBππRyan White                     MISCELLANEOUS GRAPHIC PROGRAMS BigFoot@InfoAve.Net            09-21-96 (00:00)       QB, QBasic, PDS        617  40662    BIGFOOT.BAS DEFINT A-Z:DIM SHARED K,S,B&,Z&:V1 'Created by PostIt! 7.2πSUB V1:OPEN "O",1,"BIGFOOT.ZIP",4^6:Z&=30250:?STRING$(50,177);πU"%up()%9%%%#-%*7[\F$g/UT/)%%%-1%%%6%I%%C4)<?TXM3<=C2<>ASh10B&h%*πU">Se'5M0H]xUxA%#MUrs?T=A9Gv2'9/&)k=4j018;Q#<)&QS?)87X-$q'.<B=,jOπU"oGD5Z7r_AeKc(j>7FZ[gqQgt^fsO$JlE[foW+;9GRtbKBkD;0a=hZYJ^AuJXC9PπU"tgDJGlPz0)8?)]Xb\'If&A%(\Srfa#Y\Ll*t(UPR4t1Qsj47[tD88U$n?]ZU(^cπU"^87_QhbsM/]6wG<DH'DB&=\c;.loo6z]NC%;y[JICR?,Zsh2$gb=up*(Q9??\'DπU"Cas+;*qeiV;y*q46B?BJeYU(2E:H1:(d?vDXm]_mr<Y#WDuuOylK.Io$APsn=3$πU"oRZEu9j>UT,w36xfZo*Y<Nq(xJK<DyK#Ct0,&-99>('Wu:yqjZeCVGS'dGEi&gqπU"-UpI]9PHd.t,Et/Sv.S%Q1A.$Pn.<lxvxCiEk)O1-',(=BYupT8(fu2]_i<?s8BπU"C)0>>Uuwe9hMRUHpQ:'',Pq_&%j$mXb1uPU&Itn8bV1u8qhhs*(rTI?->ODw$Y-πU"+JKLnzygdbw99jRXLjX[jMZV?\eXnlf1r=lg-N^Vu]:)RXA+UYwC+f'_A1tb<$9πU"Z>32QOO<wg#pCa/E&S=r4j1PE/Sikll7d0?7_7:u%3\]9J/1?tu?7-_0)Xk]-o&πU"ZzSdcR5/If]sHU-#f:UB%.l-Lb6R%GGi4<b(b5d?N:W+9p7;I\cU&9(qNhxjxC0πU"IC(uNS8wu4/&A:Pb2Qyq8,:.SU\LcKW<x\8h>lrP;5mR2vMqQ,WZ#VjHuS=Uf2'πU"W65=.ZDJ(&D6K\p&^9o3;Jk0Vu&?r*2ovVCFXCv86rB5:$\-Km*4O^dcgRr]5PCπU"$4)l+-qj=lJ7f<NFq\oF[JA/Omj%9;A9lgm\XiUxC,Z4Kr/;h+jQdhc9#Ar+z]tπU"a%,fI+sGU2IKmJV_S#o.PU%jB%2cF,i2xn_Hs9.hT')_o[P.+(7URJ\^^xu(+5BπU"f=+Nukf6'I#QM][/U36KtTq,tU<[uByYJZ7,qqy*iQed^j;U7vfR]dlIo707tN5πU"XVciGHT?DIvLu=P5q<ceY?gx5io-I0ft16N_$o]0eK(Hj8=Ej7f;$s\)^Q4$f/=πU"i7:$C)c3MMcM/g4Q0eq=S7SZIC'/y63,&/QM5g>x1#RZ,K8k6A#/))HLP.oHXK.πU"Yw24I$0_I:l'PFH#CQsb3*wBs2c-Q<4Fy47>Dh:zAMk;Uf.Te),W:F?GQX.8J30πU".2ELL.4Dmd[Y-1JkpO(h0&#SI*I/rtK8bic*=jxs2.kD_O+q(RSnYqG/c=EwJlSπU"r+_ju+Agr%;+PK,-;-OD*YQjK-m*9ahFmyWpPtv9U(p7^I-%/UQ(oLO))I1pzO3πU";]p-Mei>VtAEojc#<./p4mnM3;BdWUpA8AQ#Qp6r2:eI<0vGnsy8;6CxnV>om4XπU"aEjGgr,yu%u%p()9%%%%-.%/2[aF.g2(OD(%%%m.%%%5%%L%C4<A?TYGM<>A?J7πU"S10DB\z*,>So58Ml[dM[yyg<Me5pA?UO$cSMvJ\p5Jm0skk2n'&hJoSni8QhEILπU"ATKJ$Ra$phq>5p_][_-_o9+VGl>euT0rA+so$pqafukIss:;Q[$<p25&>hM0?3TπU"rcg2MO^?SYoB5:9K#bghHxDA#2J_gO0DU*GaD$j<.h'71Sk=[e#utkuoBM<miEoπU"iC5Ls<Mp(#=XcIpN'LP>p.H#F?W%k,%AHQ$E1CuV+a8=gLs]-,i<lc0UQRPWYg9πU"mLHjQ#Dre:9K%u2w2e$)km^>.x9\YLQ6MEGC7MIr=Dufmljt)B)EuQ5jUA5LHs%πU"OWOVuWVm7#7jZXNLJ_b(4/h%Y4AHiFCMaVb9;xZ*'$nBZ)0Bitua%1F/-N[ur0FπU":T9S:u'N8M%h;7naLH+#2GILV0DpssInQ;V?LBH5bqI+sD2uO8T7$l\JZO#/;WKπU"&uqkGCfYoG,Q%t3y.<1J-C4A(yE-?v7G*E&v2fqFkI+o^JN6;CUtpK:NG^Cf9i$πU"PJ;)7w'OWbYP5>5o=bu2XOC8(J_k$e$<S)>[n5VW0\9/Om%zjV/(ob$^RwjrS6EπU"0\xhk#S;2xw$gP4$.TckHLcke^c5bsRTm4MC\%ZBthdFQ;2*S2&<)U*t^9i4sX^πU"IRzb)>uZO:3O>Ql^CUlLj.i0dRK]eV\>3Dlm7za$5t0Xw:L9KtMa96Qk(>p3zT]πU"3EUG1R*U2KOq0#[YrVPrVF4b:/vdUa?/r[mcm;QUX/Q'aj9gdUN:Ls_?M**Zc*^πU"2a(7v;n&Z6^+E<4:fLz+-#'bFeSrg%^;I$RL7Uczj(k\H:uW;^H9bxiv^WA6.;4πU"m99'A-<=&EslO,Qr5CtF*%S/7Z&(0WAdb-9361bTQ[U<F</G-/v#?KGbl;;pC>\πU"MufYA>5S4:+.SS0Hj)lP#aHYqU#fQx_[4%xQ$%mU'VS<-ZOw9NsrjhJ1^J?P;ENπU"2G[9pnF^F$cAI]JbOZHWhia;/o$MHVQy&W%Z4dBcsM_Zps-bV#c[7$'tmY-]jF7πU"jL3z*2MWj&35pXu3uI:J3IzKM#rYU\>s1XU?cV[/dYQwxd20NIZ-A=EpPn.FH:=πU"dzdM:54*):nmX.6-/Drr0%bJE0Ij3P:/V'+Jq'x&up%()9%%%%-%%)q]Fpi^P*'πU"u*%%&s<%%%6%%%MC4<?ITg;3M?825JGS10PB^'<+tTm5]wCNxq0c;Z'-sST%eNOπU"y/P=WS]=v7'rPM,juOjN*u2.L?QusjLhZ.p-E[sxZsu5tecGea,l,\(h8ljO<u[πU"9M4R*P9vE^RD)U3pfIG<hQP_(1*i>Mb>)W-BlI[_[;?'qh8,B(n9PFj<ZYj6#Z2πU"7a.w32bEj.^tr;E'6MK9(cHc&pTQDJ4jh;c6q,L[PgdWq_Ocp;7ZQJ7_Wf)1.r5πU"$=6NM:hE\Kag7>U8^:(f=F$n+T)?uTI4/8)inuB'OMN:CxGBSccjAH^cH=:K4J)πU"7TFo+GMng9c+wB3+NigN#*ptnzZwIJViC'&H&z2n&Ze+p[CZ,*cBao_=$z+F/8UπU"L00P6l1,:vUOR3tSX)jKrOJ(orchOVr;S9gfE,=b6A&,L[nF0lw2(*nn&TtB7)cπU"Dw7sy9/80'e(5EW0u9?;cJZQE(?;a-U\68Rh^C*R3C7OrZs<ZTF-<lN_S-(\lsxπU"Z)KojjQMqq*1-$D,[#*4S5BAV+xHne2iztxUops?Y/F#ULVd18/soo5Jn4:$hEvπU"#mph0=.u]\j#-ni]u?wY4Tp$KH8;f/Or+agwt;>2.5qyf_;JSM5J'42Z6prp4:\πU"']evXFV/;<J1LTfE>;Y.)_O?s5%PESj*uEfNdN&6<_gpD<i]01Yh91bMLa_OoDoπU",X'd.X-jP'[)9piRkCQVrr;g;wK02oj0;_=60)\Tj^^Od(DoJ1r+0OabPP<L'&+πU">8Vlv)n'>B=Pv'6\_Sthd3rH'6n8M096kC7XI()qK1^nD)NOYND.dMALJq9oG^PπU"AOl]ZGLGh=4.CAt.>#bF<D4[J/EViQ>/IsMdGVJEt#M%P1A5]HO\#0]o;DJ2h6lπU"JOPxP_Y=H/&T)7?^Vf)fXc:6c'=q/=0[Ygg_+q>0HS3?Wd:J3hlI&\0EBJ\rBgFπU"PUAa9)2BFKp>FpkZrqrlICFVYKPWdP=^Q7(%B4r]/kwGZ4Tb3Zq*.6]1&TZZ)PEπU"Go./8(c?rWA2F;ix*1hQkV2knV$j0,Z#+Y/*0ua4f#NFymg3ug$X9N[0OSm5#0gπU"B;Xs5<8N7:3Cq:iIUa.FJ*oVjj#Tg[fe.K2><[2s_aRttFG\UgjffH.R><(4lpjπU"8p-3zLE&'D[gP[i-:C.LbkH1-i)rzxYIfv7611QHQem?.6G#B[8^.*5i*L:R2/vπU"*+b^;6<(yT;[h[Od#Q%_\eZ=pR[^[eg&t%dmm%9?_<fZLgD97j%F9UY8W$?2^EoπU"[8&\[m(>ufw:-/T*?:DJuXeER?xCZSDq5n%n'bq7dfe*>:K?NlM:q#M1U0L/NbgπU"1DF]fiipM8>VqG8P$(%58e2K(;%Epu6?OipQ\DOAsmb:t0e-(8Q/6xN?07^C#tUπU"N(V2K=mtsSLUuk'f*($^BphhwRZ^Tlop_ed5f?4'-\3jn,t*?%W<uaqqxOVkh9_πU"M(T>>;HTPW.B:&va]TO*JaQ;DPgG\TAY0Cci>,$>6Q().Kj>=)=.22o6AvxOXF>πU".dMA4d_Dj%gKnU%7(R7Oi%Q>MrdOurA6f,qQb]]:YSeG&7AD;s5m?#I'NPzREOJπU"HmsvK:A-/R:(k>XT5<J#IOE#:qGO7]g1Wg]EzF:pV&/;]jS#hYz5pq_zZ'fDZT<πU"UaA>QE?b&]X'A=WHDebXSkN[_p[AyfRI$kwYcQrY$1+6A[#[,hm5.0yAsT3l&a)πU"I0jDia/.ECj5mG4;Kmse8Lb.CMH=^*Gz.jGo0>_Z?4:RF7qSUB1JG=Ngi3#8t(_πU")J3MU[uC=grd?-nH#ieVBF(^D]t:e_ngY,1f8o]Z7GYFVgYf2a1td29WP%Cdf^=πU"i_%=ch%Ot$+#ELIw]XNW/m<w\hVrhc%Vj;R(EgRft+g;H1rt$v/-T&^4L9rGHwVπU"j0*5)-^c?0)=,#$,YHq[AD;Lq'1P9:Ya3tW4h5IiOjXK'oa\8PtfNGjXB;]'8upπU"(%)9%%[%-%?#p]F0NhXwY#-%%n%<%%6#%%%C24<?T1l85WM1B0ELS10BW>'t>][πU"m7wUBXxpB=j8gdFQ_E(qQK^Ej?7C(1?eS3B8DwR(B)12;3jIWe.8.tDtJ_r*F3vπU"b0&M*i4zydQjNrBYIP6<V\jxydqj_H>l//Y0S/fC_fEMjXbifTff/Vg0e<Aa(VfπU"cr009GP6b2aaDf;\c97P</'vBtcp,uBKU37fJp0.%a6Vl.(5Ae&n/Q[zo\tgXH_πU"LbcQn7P>+agmMe9)qZwnS&6\=\Rq.RO5NCo0ph6KE0KIme0aj\1$WYeRb)B5d$>πU"n<1BOJbgrw3ocPUqJ=%$Ant-R-ae5nF8ZH4I,5Zk]iGe%)U/cI(pu>I85rI-f$RπU"TlLRrm'SZ'-oQ4uGp+R)r^ZT$pAgLQ41u^--.DF5Z/?JJTGZADRP\['=7I-OTM8πU"6RRuRT%OF<,.Gg[=-oG5m+^0Zn'W5)47(a:/4c_])]kh7u47+/b6mN4^jI(ju<<πU"hPZS8%TfKxXhnGSufWGkFk&2Sdg9b+/,3xH)TYeA]o&t,:g6#l-.hQ%*kjeZvZ>πU"-S,JlT3#_gY4#;'p[UDmiwZ_t,6*(A/8FUgA'w&'\8%nA/?+6P3:GQj>S6;&4zTπU"tRp1*]-NgZlC;\D)3-_pBfST*:LIpoq[]vY\uoA+sCyz\woV#\tZWcnwZI*v.6WπU"bB*TGT]BZVwi0:gT4MF7*_d_1.jJ5D/tX%a\ye[5t7s8M9\Nfda&%SJQY?,&kIzπU"B]aw3SIgP9GZ7uP\r+b_TRZZ/l&VS7=$O:]=j:SP.P^FRMimcx2)u><EN9ZnChcπU"s('*Es-h't0:CARFcW:H0R%62CK/;tBq2Nz:c;>\Q819_0MI8CuD2p0dKg(yNv$πU"S/ssqCNWw%3P#o9O/tZNWVl^Yrg=QTEW:0:ju4O1Zw>b^r7:v5DnH?ss7]U/]tLπU"8BG+nY)Do.f>HpZ';Fp,>Q/=_3uFS6:oQo-hV;erkQNh7[rUEt)?feX-K:vkCf3πU"d8aTD<trnGv6sS)OLG3l1K2+[Z]9Q,P3FP88S'1Q-ey)t2I$t]pGs%^[oGKC-2jπU"PDu6Zkst5tRC'dUK>%3t8Yck>r^%+XQ2Yc8-a6pdri-c>5)&cSgdqE/E6HgW(8>πU"F#dJ4X+MeA-uY\dDdWi.NPISw&:o:*#QEY)Ru*WjQLfnp4N<E*&>i4?D*969ggoπU"K9?;EhaPJ;/zCM#rXO;GF?)G?R3,kF,%mE.qhqj#2O6RWcJ<?1Rl$M_0vsxpFpjπU"+1h-zZY[\oX4:AT+VHzT>_]m:Ak:rkYIqP_Im/23,(K'SxtcW0ETm(b]W/Gr,19πU"7A4+f<6H>xIpun^mhaDkV%To/yC=U0Tl3]CzPH&'>U/rh3QSVA:f>q%<Hj]uEw6πU"n'9Me5FaJ.U.-\;*jUvcS+x-&Vz.+tjmj[)a+.5-tT',PsIo/ROQ/yigVvT+d#:πU"W2<=Z6k'dnq'_^xfE-CW#4Vj<dsVg)ihfGpuB=h1+XRuN2:#[TND?'b[glBM:u8πU"'tV.N>K%>P;>In,nhukm;a1(6'p][(>FQ/-0dYOmo1UO06byoG6)8g7+.<iFvCGπU"s&PYA1$bpdb]oY=l(^-V6iiSIZnVKXl-WCxtN3Z?haFKprNUbtq,w>%0s.f,WDGπU"]\md8F(4bcPG183'W;*g8mmKl^Yy*\0ie#&e%&J1Bs#<$HG6LXxos<]K4e*+XEeπU"i9v7nN))N^sh2?P9^3WuAcBNKGdhv)\qM4?9Jg3.SkH&<#d-4;;p<p6EP7LpdgRπU"6lirD;xLKd]_kROi'A3MGU>n[<u2wwgo8wXYq]0qo-\%$139'[0*bF6k[Q\HpvMπU"5.=J-rUl7K++<b.MZqO)H\ZI=n6sN.X3ojuJQ3<Wovtub9V,,mshNau1N-xD-enπU"FVKYdrlc:hUpqx(CpMRf[WH=$s=]=EEHCigXhMtZ1t??rK-doROM1uwe<GY$ZsUπU"O''?IxKo>RpT(58'L<>t2kPI7]]M1[Z2'4Xi(/eM3r9As]CIPbc'gCri(%LIV;1πU"+ilD9:'$;[8(=SDiKX%+Ze)nRAMU)qncAu<-;C<2V_AClM42'L)7OP..%>&&[JgπU"PDog>\'9IhT\doNy$XDd(uni9;N^bD:nOrcMDe5yqbVCY_P#sm=k6NN8N'Oa^CMπU"eAld8aJ[LdzSEd#crWX2hifGne('\t6#AE)vycKn#1vegO[L5?ho%i3#jr]Q]$wπU"e*J'>nFNvn,0rnl;O2)V4udw-,D51zBfvJ?F,A#:Q52shS&7z?t0%FlBli<NL.ZπU".X]?Ynx\?:qJ:5BH#.*ON5S42X]e1cY(q7A(rUnyGie[7Df6dvVbPAR-Wd'6n/IπU"Q0ussHw99#0='M7u3dmnTYvusd:]MtM[=K_oUATw27<v/7#*IE1sI)_34D?HW3DπU"=Q4%2Wd]cvaEL%>0WGfEm'-Q6SYU9'2nT[KRo/$ZH=B:rK-^?)&qfR=z+QW]007πU"0L=(az3('gR&j$g=_(LdX8hju*$H*?N,S8/9\#v=sb+Y59,ulqfZVbq=^)'a.d>πU";eZ(S$5i)eF6%hVzDzGII_h%;4)ze2R$8jHQ?gQNm4HGZ\XaF]BP#AqU&nkPB-vπU"EoU;a1WgdKo.G[ZU9uDeQHO;z6;:orQ2nh-vS85uP+rjCNs-QF=8CF8Bp<<x.-mπU"Vx\Lb)&obFNw;+oUXyibSg76KqX<KVT]5B(tq3WX:bjDoUWC>m'XXK2eP^1X.=(πU"G[^8ET;i?k=q?;5LJ.I$F$u<q6bDm&rw<>X(+_8PfS\3vXn]WBFlbxi#t[E1#BlπU"x*9U%tykaZ-qXJ'8(up%()9%%%%-%%Up]F=erW.%l1%%&EQ%%%5%%%MC4<?ITl8πU"5M<0GGLS10BT^?v>TSokF4IwV68f[Ig)]^YrLubvS.].I)g]o9limCa:G]j*;$GπU"g+sZPXEMhGF<L$_IbV9bb0/ldRhRurSRRn,DWsY^)k6fjKA:YB\Q\VYT<zLB[EEπU"U%n_M?e[tE]kbd)m<UV:p_+3Y\;A<;=%[20&P#DFms<_'lv>.ei9D_C20LpIu5fπU"W9O<XLE+H)(,&5[W.[\Vat]jAVv=Z*)'dAC5ZDAX]:*iR])gdUTxc];SUW9B1(4πU"]YS1'2#DSd;UjTqPVkqJ$$Z#pYFFqPV:[bjasP8)mBYdWiyi^0F_Uzu]'PY3K?YπU":TC#9IdCcRF?X9lD7n/)8'w$S,%wgAWe$v&),nfB6[BBB*$J&0P>-4)/\#M$Q5PπU"8+jG7.E59US(_'mh(at=AgAPVw,*tlW^A>Qj#P$kSDt8^$]AH=*24itoa:P_?lTπU"/ZU)hnH52(*CdO1<5WxsO<qjq>2ADUP)Fpk0cgrEdt\[5G/*gni6[p\dTvd^a+xπU"itpmy)m&Rm[aiRg52h<QnD:T#UWTugu54p$o/U>:'6V$Zwh9tv?O>7aNKeED$FtπU"&m<E)F-zV4+\&NN5N=;=1L%r1B[y1HHA2A?9L>kse^8dfgb[hH)x?g:JihsAsViπU"ble:jUmInTLTSxR5r[fHcTn/PpGKE+*Q#f1pYBRdtNetjZ&DP$.[eOuD#/Z8oltπU"<XZGz99OIy]MV/+4jDnY??>a18D$-<US2E:kR-2gZNmdf;.CB/nqujg+'1[Bq+)πU"2]xh)g:^sI$T1A5OhO0c<-u5j0a\R6b;ZAcAOA5'%Q1csQYn,zcl7/TU[rS%:5pπU"TDJe.K%J8Xu('YY(Qs;sO$:.;^e7$^InF0?8:=-#X<jESu?ljKOb%[ZM(rYn0I&πU"7(SgHQ5]Vhb2gUM(L]MTKw\kr+#]T/(:VYS-blDf3z9Z[wh_f1)3vPHCsuvp_&.πU"oZXN.u5Cv?SqLpm^qO>aEiv;Q5R1mP,q8;n(:Nfj*WfuTn<94f\:CXs1c#Wf*EYπU"_]]D?]hUo;du^OP6Kt)f1&zY#1T)\+2k#F$/m$<XRM^1B3E$h]r&mqigW?.\$X6πU"e*Ls'>I*9-CulWp^^3/H>OeAFO+]z5%SYV#]M1RlKNX.v3(S(>[F/e_MXEX_=6LπU"4vr(:sJfQHC9I#]8%pYz_:u8_<RLUw>>mU=;#<wsThW%.&VI()foqcAjH%N%W.1πU"FFE5D2ex3_ZT^$Pz<hD')re13x)R#[mhin2gGko]-I\HMSB=-Yc^_8'UmnsgJ)aπU"TNMSB=fLjeTXy\/>\-o:K[eT4As=_FImA,g&/$5pXT+u;I+zwT;:cD(L2F?YTFrπU"mpv%\KaG/q5hSNeHX5'0-C..l=uOYc)=zeKONP_Bfoq2tBSjjt&%4-11Mzd>*j9πU">[m<*EKAP\6h%-tJCxGq&?1wg=*ws1V>])-3#0UH0C_tFkzjxuhMAFIc=e8=PM)πU"#^d5JA)cW*n'uGYwwi+NLIR+FVvf2B23>-1i6Vwurtgiu/k*Q+6S11*4HhVDCt-πU"\B-pJnOc][o:C.(QD5&NwHZ?pS*?oJJ/L+9%vwl_N*c',nJWbKWa9>ARra]cfRxπU"KF$pD2C)et$*q?g$;Z?*-AnVY?op91YT(6;\cw0PUWqKjr(UoBnMH\7dmHc]<GcπU"/Rfb2a2sB0z=UN1,*VP^FAr7vvYt>0mM.&l)6lT5fWg6QJrPNPDy'mkjgKq]m=wπU"/?#BNM7>sDJS)i1fEz$>*MLI+?-6;2'Y/BeN4xAVQhhuw7QaL+9F4OcS]rmid?lπU"s0Sp'?OMD:\AK-mIC[j)u%m4Wj5h>:u>L^<bBkjiF)'Te8O>TW9^<(UDG(4UaMkπU"WayT]8AbININ8WA'Q&Jpo<1.RK-'Q(CIY6e?<Ls'W;6Mc[5D[.K8G4F0UH3JOvUπU"T5/;47u?o[,*GffC.5WoMW5D\zsBfmthj4VhXK2a4P+C?I<9J/_V/]bV^hJf#^)πU"WEsF?Fx$K115<K1gvH(vWZZ(rRq\D*7vzW3pGd3fW,+[]S[u1:5ui:JsJJh_s36πU"Zji+21Bcd+_>ozJ[zCCiMqR;k(wjeq_kB]_edFVJ;2LgsjeK(6T*J^=0.wgg;R^πU":x#5c,Ok0h1)TKNB=tt5;Q>oR3\8Jj2CnsAL_Jxiw7G&E-8kR/'T>9rOHTYX_Z=πU"MObC:W_Hbs\i[2bP=f>N;6ZHY$,:'Cm?DGW#ReGLmggILVzX?mVAW*GR<=?Ji$gπU"BX<ZE-SWgJ-W&dX8<F'QX_fT7\MBA[brF-(J0Zx+t:u:wcb]V:7;lu[2L<yT:UlπU";7ZV8XBG[U;%N9BOG#:d)#^/,rk&Wa&Jb)/0SL$nx^o683_9nb?=9m5)poJ%8WdπU"&\2v$\wSB,t'1k\nD\YcV-p2m:)Jr_p1L/7N+1Fju1%FCOPbBm:J#(gMbs(NSlQπU"l\S%#);PV*DZ?V(hSZdnsm,(#hzZT,M\tA0GtM4M3tB/V\\kI^AUjNXF(F4ChyLπU"ay7Ta/u3#pW#Cr?KdoR%Mx:w2xd*2LI;kl6ZsvWO2/>ASu^0ltg_E'g]Ptp*F(QπU"65C#j=Hm]lPt]*Xn+_Oc\Bd]^)LIR;3+iL4KL'*T<R'=s*&FFEKj^fnYL(TOg2aπU"R.R,of=02_yq[oBM%M)]i*>&4&v<P$)3mHjE3IQ1e:xs9,$0E^6z\4/ZIkM+ULpπU"?EH?9#N?3v<1GInu,xAGecVz%h%gRlN2kj+IqIIcY?K%(_ks7LFJ(-aXALJbOwKπU"G4BRlle)p>gvfRtFVVmdAG]*\3b0RPtMdP*fC&NMPbNC7qOuF$FPAv9q^7zsndLπU".&b)\5Uhnd?t7k7]L#3EXbZ#hXl2ngDl/m3i[hV8+7dD%%\2LeJg-q7qGDe*G^OπU"6:a8]bjv(4E)sh#f-3)<n)QsJd^nxD)5YQr&mb.W2,9_3jt^C9+fn+&\V+C6;BtπU";QdGT.)wIFL:iYyV'#plC,)4b9_83m1\7Pv3#[(2rIQGt00<X;%-m9[s+2UH:k#πU"qS5K\GtF*oD\zOzUq:+R.qYQQ&wy4w3*Rv,g>_ucdkju6b3e^/2I%6'YlD*t$ZhπU"]%H,:pfN\CDfgf;A=MuPGkYRQ[WR2(*hADP<#P^p[tLqiz0W3eSI^.eS4?SC\)NπU"5o9u)'_S8X07ke=OvmqgUA<$1/6q#'2341L;MBjgaO*H8SoQQ6RnmP?=XN[MfrZπU"k)se>^&\S)dGttpssuQSa.n8rbLfMr<\o2va#ny6\]0wL7ki]pMO7JHN)I;oP+nπU"JJR\nvk27eT*TT-'Ukj.b\)h%v:/6IpC.Lo9>vgNnxgL.yViYkq%_GuLMlYSNMhπU"pbQjC<[&SEh5&Q6+&G<_GoAC*u6qor\J<Bcq/&8U7u,-+dY^7FE8'W>XD?v*tDtπU"i&;J+7x*;9xA\M<0<dV_p5u&;';9oW]8Q2j7_mR^&53AorheXr?U#q4kg>.k97XπU"#fVyohFBdfLk0VqJUCm>t#Tpf5<P-Y3:C>O'Im)]k;VCrSl4JFf2s6:jt4wV*s>πU")sw?Y+fJaL#&b<>AM.A8VF.&QPWq,#Xd]^/RHt]Yfio&s^$^b?pChaWTqjBag#8πU"_ZuPqThC>;NVoTm;gKJFw-IK2r1v>%WKTEr$j+_jn#4<j;76'JO;>n(5,'^[^PlπU"NwTlS]lmzpF[FxMFY#h&':#L7Q'#oW/I/=^7G$7tNH=#2<v66XJ5=mY=)H1XP56πU"NgL$2x:FrboF<?m3X\5=AiHhV>vrmePG-X5XCfDT8Q(1?<[_(qz(O\WX4fi5ZOtπU"(=7(;1*uU+'#:%l3[?*WKil>A#AG&^k2$/&:3p3Q''^zM?iWHcv'/TXbdB'bMFHπU"__Ti2W2n4-USamFZ$Ag<J1D9-mD,:o&Ji<$i.<1R(k-'BGAF9Ti4<b>Nt-w&WQ0πU"%b$a[2gPq0-oK5(M0TsQ6m(Q?-r5Z*qay,\)CDiUFN,t/K60[k^xiD6KEw_1XckπU"LU]#-ukV:TYnsVPl]oB7p$_Uwa48$I+ArTu%p()9%%%%-+%F.[CFg*A+;]&%+%pπU"'%%%4%%L%C4<J?T8<M064BLS10BS\vJ=BSe5K60]N=2qyU9du1<N&oKz/(k'*$pπU"W]K_'fU0cb0XFtq+?87DJsw.tB/eVl4RhR#bT69AzpA425iYu\Y(z'N\L>$9-gZπU"^)fU]4Q6XSi:mpOJfZIxS2EGp[<F=P&'(*zygho_.J09Eqqqpd1ask5F9[zq7.EπU"2&f*;;4/1w4QF,h^W^hsx0-TS\%1M3E_944VgFBlKyY0c%b82a75^U=86C#Q8[)πU"Ev$'u4GdBNHp2v+QFj[cH&]m/5zpJnZuLu)iXzbAM.n+'[2v9&_<2JS72Fmos;JπU"ATRHzXg3ZhY'c2YFe.?*m>+/&45VUll#AK=3VIM)F=qA%0RCNf*,G//>0.SBcyNπU"PL;Yeugzr4h&l>oLZc+*Bg7:CB8PTsNSDu-OLI-aGqHPnhSP'RX0_0kc[0i9[_lπU"]GP;B=>_?id#r5dt,G8=tl8mpwk60kZ7?Dj&o\\eW%q5*d7xMP^jXrG=##R,rHjπU"f)h_d2<*Tda'R49VBDk<(^EbDev?b;w)Z;krt$3qn$S?Qv8O[4(D3hQ^Y(J&Oy.πU"jJG+NZ^'3,>J#P=]nQrHdk=/UhR6\3q]DJ7j64[\#laj8]1i=vp-M6<NPJ+,<R$πU"w*%up()%9%%%#-%XHRZFBV<j]c).%%/4%%%2%I%%C4D<?T:2A03SM10BTkfFASdπU"m5OhFyj3<0eO?;52\nrbeQsR?uQ=QA1f=63PxY11(7Rk8'?[Jr.f5;5mlBq7S^^πU"n]k-n^U:AD0B4JIU2PltMsI3$dZgbb$buLrHNcPg]qhfD^d%S;W3,/3d,6iAZV(πU"?r7U/]N22?R&+]70za\)AK5K#a.'o5,/AmJ8bLINYvwfa1<:iiNT*a6mb?=e1IBπU"V)K9Omk$EpcZG;<4>Pi1a+E<%4,%60r8OWIbJPB2nm4r&]u&]'Z#9_QM#nTsI$6πU"*,WP#Im;nTji&o?QYa+cl)o8)3]Db?w3Q>d*,Se2VW:FrQa2zZA1>:AIznjK1CGπU"g#M(sh_9MMlG?6Lr65;%VhvC\38QY6'$'HC=*(eM,4[AXfg#m+$iQ,56E.U4tqpπU"5+NC#R%4J._5e#<cIE>6F7\[l&RokVSX._]spzSn-d4$sWNT,**4ht^Li7OmDXNπU"B&1r,+'<7s[sK48>)P,hayp'_^aeKB&X[kiJSu^fo\cJ?vMaWB>;hNJ9n1,eq%<πEND SUBπSUB V2πU"At5n\/Ia5\7CXk/n$iKhgjI^nBUgIa++el(a=#7Y*g,F7$Lok,GYlqhahT,u=[0πU"_JF0JaR8kx[k+qYog2'eg7Rq%DtS1H>(fJ9oZdvB%k1wDUZVfTC=[EAVD4(8Z:9πU"Ev/lgW3S^>XeUEU^yebigEQn(1?4d(%u0(LKQW'?8H3'9Uc'YH3=g4pyS1T2w'kπU"MGIRI'?\*d0BHB4(H_RKiX#Ke79v^NXnIHDr8+/$f[uWv&X\SAe'BYz-cmf6\8eπU"8g^qS?lQdSTs+9ID*2(qL(0MQ=pQ;Z=-rf[t))VmnNU7T/Bi'BmKs-18&lXu&\iπU"CE'X[X+-d5f.+P_'i=w=bK.grbR\H18N%_^:?v8l')X065qdICK0hz+%P<rMtm-πU"CI5uX\1+>TqK:g(c)4r;[m3vbIME\$EC+e8df#cKt4EkZoM9:)u<;(cBhndaMqsπU"QB]XAjO_blAe=EVe4ojVYMLG?&A]$2dKvF<H3kqaJHY]]2qcV0sh4Hn$qh>/CzuπU"dGxeL\cX#WrS,J8:NAZTWqfenbuk3GPnuK,(szm.?cd(W2kL6L&c;*q_<p27S]lπU"dyq>V?,FMbht)lEa9*4F,>zZmf+&kKwuxeslgfq'RYv#itOK+XsaB+awa;+#xr[πU"_Mz?80NqxN_b.zkhzU;BE]Uo=&7mxKUdz]6j2ReB8&Oroph-C]ln/YGgIzf'Z,AπU"'qY&ilQr4ar\ht<A%BTKt3io\Y7ZJEqFMhKxaRTZ]i^qMyBS^?k$^qMuB%4?WTeπU"bzd%>9AV*nA>N*;JZe/8'lhT$IfpiDtUb_'RJyl-w5eSMTKxZcqwG4='OJ4^9I:πU"'i\N(AcPNw7T'Ye]lE7&JTp?kh+iCuYAMLCh;bL]y.D^\4&_nune'jedIJ-^9QBπU"=h0O?YZ3LGhWI+&5(_1=ihKj35V&W<5ATAli\hV7eFEs8HiMm>)$CGonnF5[G+<πU"/C*sY#Uo_M?wHJYA]$zX?G1Q;CU6QulQ<u_72(n)ISL(0jV.BXb#<FtGnjJ;1BQπU"m9iX:G)-#uuqd4FTWW%$vQ20ZFlXRA2Tcpv.#ctLN45hK(CdXlhs%<up(%)9%%#πU"%-%_B-UFw^^UvA['%%<%-%%6#%%%C24<?TLq8=42;0EVLS10BK.z,>Aje5KFl[dπU"[;qy/#Yv[GOE:9Pt%3vu.&'[vd#CG6f1K%<Qm>wBxi7J67+FfxGOpZ5hZ2264PFπU"Y<a:=-mLpwd:$:He#M6:PvrF;L_KiSsoXi<BUeaN?hu]1n[B<\Jsxd:z(FVf]\RπU"dry4go&y^C<2Ev5\f<daZR6>I0A221dc?26^Tm*j^_'G:(l7-(RU(9/(CG)S%SbπU"L1sB116E5Ay4mbq?IOkm9QPFI6_^%:(5[)I*$;/5GX4LklA&1L-<^ZIC['FuFY'πU"ZBF&/d;GB/d?)f-N&3z[e:z)n'bM]VjIB>[#;FOAc;ubD>8^.+PW6m7X*5C<cuJπU"[KT7E$0>.>p*Q4;pp0[jSfvz&:/Y992>wF_j^+DHXW%aY%LlQ*,L.,>nmegVtMbπU"?j<AEwMp#x'Y)[[Jq&;c7P6;ji.q(yd\Z[$\N*]_zW4D*U725\VGHWOcY)B0AJ%πU"(AuJFA2R.-V%3pD*Wjz.;fD>pFJ6m;uH?3oo+N6A&?:x:-Xr;G&x\;K#?0Zk:>QπU"45D>>KB#_qWR5Wh_\^C-jfijx$e[kXm.5,wnys,ppp+m\x0t+h0t1hY;TG&vrzqπU"42;%%>;PLN=xF\dfrA1Qm(SHf<=Xd;yEt<?N/whg;%FJTh=Muo,r->5e3JO.ABTπU"IGD^%FPMaI_,:T_*e]gt,fn9zI/(uey1*:Q<PPQiK7ANlQZXR6e=VC$2UrQ.3=$πU"WCNF'UU:%FwOtAB9xp'3$T-F;2r0qz8-)nHv0BTl16;Zlu.;uOu2w=<$t#kKqS,πU"IX?2VJL;4#D)z:i;dgLuhLW$g,qf[c&[6Jd]jPo,]qE+b]Dj$fLR)itB+y.Acv>πU"uOn>tV_NL&M4:i0[vAKl74F:COc_&w=MLR2I^5dKXUpJAVxX26?FV(+>.%up()%πU"9%%%#-%697\FB):?PR'7%%=-%%%6%I%%C4)<?TuM82B22A>;Sh10BFb%ZwSRe5wπU"NgXHV(0/Bokd#5;dKM_91<DW9eYkOwZV?iM__BahAa#nV4)FX-=H=/Xlr_g2TNVπU">F><pe4RT2c#<#UeWWmj=kq*Y6c1\%_oJFp6-.KveAq;jg=g&Amdm#E*7.1q_W6πU"7<6PXU.qd<B5TzO1KM[8^n'V7BoJ'X_XfE[,mUKxu/9=p=I8\V#wVK(^iOes+)UπU"+-KJ<#k/io'/=hqWB/&SVf';,W(KZY7T=suv*tL9R=HlnU'?x1$]/<y:+:$=n2%πU"[B+H3er5>4QFf2>RRFXX:rdAl,feD+?l+ok-:*M%O:8(gV]32b0JWFPubtip2EKπU"b%FG$z]1BYA/=+\OT=x_Ih<j[fBO9[,q5fdhCc/PBpjA+2O)Qx/d8zR.)l>SGkRπU"nk7HTb^Wc3:ElRBx[BchCq?1AW?aPif9yorb$I6?f/M=2Of$aSC>A#y;MmUqqv3πU"DQkEx]:cP5P4;y;lbmgReerl.Fa.H>d_J^4d$OqEYtV:H<T</Mnox$[d:cM;???πU"LNAjR\pl,*V_oB(lLac-#pR0BckPe.VDl2fmd&_X:xZ<lvjjurGAV#zRE^uu8D3πU"[tOq&_Rg86$aS%SlsP/FsT[gc:MnecZZPV_]tONP'xfQd-c^2FOJ0yuftS6YXaMπU"yN4*c8I6hIfjFvxeOhp_+Ua:Epqz\up/+*:RoqD;xk/p:#(HCbDFjMW):ny.>23πU"]w<QYdZOLJq-78N.+%OSUKp3;y'0p:5;;[iSNEVX%]LmFhdZn%6oBghLSvnZ7I.πU"mZP)rb1D<pKm/lveu:Tx$XyQ?T8iv=PUb4U,IglG$O\%6?pmJ*\LhR9,'l]g/MJπU"$)Ih3#tj>Wt1cDs1c%A76+1h'ti%Z'86C2x,gHqb&o8=vNlpe,_sniqi+)cw0z)πU"(xwd.f\6RX?_(dW+/).%up()%/%%%%%%3qR]Fc:7s(E^7%%E^%%%3%I%%C4D<?TπU"BM:D;;LSI8?%up()%9%%%%-%rh.]F7P&N>G'.%%[0%%%3%I%%C4)<?TxM:D;;LSπU"?0;h<a,G'eE1hHX(YJmN5woH8*Pw8l=snIX?^JpAaI$6ph$tYu)l>YuGkw[v1'wπU"7V;B9+kXDJFlXg\)_YkVdm[Y:(l8f_3;/=UJvsI7ur,m_ZOHdlC/XR#6]<iY7V5πU"JAaMU;gI'%\bW./fCWJ7mEm(RU.Q^;L/dfi*Mt9J;^</_Q3P0PotXL[-*#m;v)CπU"_?dZ74K8Be5kWiHO-\A>^iI><Ps5XOK7,(\m,c0Ki\6&&L>LXMnTv%pDF_RMEl:πU"voo_E-/z3H8KWS-5tEXWrI3DfIEM8<^uPH,]YjqCzD^-45+mFFbX4Zb^EiHdHVWπU"^,YQUR,vsa;9xt7EoJRK?$eaGR7,aVdcWV&6e49CH7UqkPu'UxN7ZYR(K6:bL&xπU"s_GNsWE5BajNZBwhrVYxVElNTWbvHLp^2;QYfRn&PEwKvHGILN:X,m9I+$DMNA(πU"3ygUw>bWK//M?=h[<uJQV#RlDtFC/ra:O;BebOVnd6sr^:%YBb4%Y.+?;Rb>GB_πU"6\Z:OXDL<JNk%H0<$9bco,Ypi[Dyiqw0%Bt;2+0h.pvq4x_id<X$tBBRScgYi[%πU"iRSD4?Z8xZF9J83-FH,RuN[m=uXKjB2>.'*<9P*ROow1F7e,Tn42omp^P*>F6e>πU"kK(RTX4-3wcixqGh&C[Sccgu4BE'obtjJtzd^\-5f<a+pZx\ue+vj'v4up%()9%πU"%%%-%'Jo]F#IG-;&'(%%'A-%%%6%%%MC4<?ITx:DM;;?8J2S10kBF%T,=Se5YL0πU"]NDgawo+JA3FF<Myq0Q6%.ak?vSu5&j?A'V[,oTR]dX$47/7,ynF#4j-5V66GmrπU"2G5&*>B?)l)jf+QM+&Mj1qLo^hfe;sm5SnnIbUJ=GqfL[PEVe&q9[&.JVdJ2()[πU"Rh,nPSVftjCIFpiM5:E;=SlcCagZi8_PljwR><Ub;4\P[$A'qkeW'PB7$,L[1raπU"C:m&'N_fXF'v_:z3(GC$TqeQ7T;.RP/C=ncYT$CBM1HR4\IW)H7b1B&V)v&yFfhπU"beE^kXkn&8ePVjXFHb*kSw%&7%hheHAiI9m]u%(^%kFGM2/j?[7=1:ieV4bw$qyπU"0ZUuO%#t.^tvJ03Gq)E0>*F6tjQkcgL'ldchwiVUDwaDC7]DnejX&*H'I;CPJ]&πU"X=j-c?aWBMo1mNVBp\hma&&E^I0NFfpFI[#zsweYV,&SYRRAx2,E0$rE9,f\o*+πU"K^;c$<K%qV)P-*&)S(7*;t4bdMgA8On39?+dfW)30JvFgu>pd(Fb(J_6dB'-m%^πU"d*;0/cVxTnMha/8FL';Dgps^z^Z2K^W&M]7fY)+LQ%:mh*JC.-0xe?lcs1NF2V7πU"n-*&E#qF:7Ls,npF^:Fi7xfT\?U/OoRj-(d0WVt%$Uflu'hiBiGj9_1nj:s[Vr9πU"Ca3Db\d>Q0DpnQdR[eTT-q1ge_bU?L:QVl6ET>./*jb^\$aML3RfAgI.:HOCq?jπU"j+bJSb-#Mo_m+m%-,Abq<=_kQ96i5JV?vuYHbMm21#7RP,(e-bLbYl'm.lIZ9L<πU"E[JnK[/%:t7RDdTib8i6R/FO(b_uN^'j<#/5jxLk<HvE[ub7nrx+F_#Y.iNZ.m6πU"VXl%h79X$]>4wgf*dH7rz$BqE)W<*tmg'7dxkqMP=fc4Rvg'>ZK=4ijK\kC&?(LπU"[jv,>Ag(H+aWwg:1NO>Dfegf_/YL+uE;azUWaApLU91S9&h3/s$SH<'UoUSok*oπU"H?*&g[VmCf<v])6N2ZaxT_:^LLFpxo6Fn_NIw]<FH'4-rdfKb;.(AIUYJ:'&1]iπU"<C^F:NeYwbe_;8%pYCm15_F%9\M=SB;\?-[fg4[RM2iE]K8bx%,up(%)9%%%%-%πU"r#h]Fg][L_v%T%%,'s%%3#%%%C24<?TLx:D;J;S?852e+&S;#$D?_)D[+iWKOs.πU"A;DQ*od)JAg)'Ic35'j0>E7N>Ol-h\Hu3JZHR-:>6#^:fi4Eu_E3TgiC2RV')bsπU"\/OJWAiXwvBWkThPkI)d.Gl3O<Dx5jR1hay-FG=?bD]jDY9%QJ*xNlPT>+;x0^mπU"QdeknY_pjfHhkJhJhrx^x\4>pGa+djQ*$,=Bl^0m#qsuiogiKbr#%0xTCuVKrLaπU"\ifqMG=&+Ut5kT;q(/OknfK?C2+ff,ntrF7Cx.qow$>kWE;VMWbeG6*VO(dZ#j5πU"w9=CNxFH#LukzNI<0/[CcBh+-=9o+1tci5O?E-3K&Gk'[;u4RupqDlH5g&S^\*1πU"-c7>^AJiMu/%5k<t+,rRK5lAh\%/nKAH*2KNQ<6<*0mDNDg.tzJrMi^O?Tr?DdhπU"lQ1#\Nsmm*V>,x:=\vkTpVlHs=-:qc3:B+I*+,-l<]C*w?&TlrgI?L$GB(bgT<4πU"e3u0eT2VB6abYOI#J,=tzT6<%///hSnTBITkd,RJmIbG51^?</H\cH0Cg>Kg.(HπU"LN(C1ni$w4GRC_8j\Y]mz]tcW-('K$xVZ9nJdq_</dAHQi#AAgG<3MlFE'.t-CFπU"M8jRdj3dI,Qu\VQTuDpvOlhgIoNQfbXA'[bk(BLO$5iH^b5F3'Q%sssrdtt&_n-πU"dl]e24LZ3lFNIu;qx:<qMV<L5ah1EjGeg1Q:A]>2GSLo.(PDW;Grl'8\]]dMN)lπU"3rLIO/brvUI)XO+GMU%k[O9K9$Qf#&kFWKfpPF(%^M3EwDGMMBT3wSIQsYl;/'aπU"i_CvLND\,/U,dcYG(MS_D,X4hJCCbdsvAP_HnlD^O4$jK3q[Ps9E5x[c.rbtnwuπU"^(UVlr8KVE9G^-O5]CujwvRC3ooawb]?xHnMT.u-rhKT-47\I*vE)EVY2bS7])uπU"BIoKbhk$(^2ru\Li1Piu^/,S&Rctf0X,Lotc,F#oVqw,7waBJBu3Ig(od9suK>hπU"QjHZ2Vp>VNMR4HKLPT.gm-iO5;qhq&d1'A:%bj=#H^A*w[''0aPfPX:Y(9k(FTpπU"M-HO,7>WwjR4L>Siq,*\Onj/0nuv&P$&[78tN7.5pb?H#^hpc7O2._XUpoUCCw&πU"8IJ=Yjr7)7g%Fx_Yc81i./L1%jZqf.tuiC/_Dqgd(fP<5GAZlIByq<fC>]UR\8PπU"Cw\.WbKcV%*Tm=GEvek%E-FV,>$jJR_-:fF>B&Xe_*P;(v[d?bK9DFJN3N%E2=(πU"Tr(K'l3h)=UhKq;6Hq$TnTuqQ[ogSNFuj[JH;3)HQk*r4OqHP/wTw5qEsSAl6tPπU"JL^V[GXL^V,xL3b$0-?;Mim.KXi#,:ll33;.4+=>%G[Ze0XLl\TNj]JtP4r^A\]πU"60x_4AWLY500ZeO7[?o4:_npFN:G(q-Q750iYGmn2)tQSff$ocX.ninStx<G[e.πU"CBl^kS8[.yU)C]Tjs(i15gK)_*RP)ut]r8?RZ%BXtD98PElsDW[LgWU=M?&suW-πU"v4WQ-/Tm#=5$phFEk(YE7NUu%OhO%2+[mqAvwN3+4npJ5[MdN^OSa4p3x?/+u=$πU"\tEw.D;ZDdad1HWJSVa0'ERVcB3mh2TV'.aKZSN\ukj3Kwl9f3[uAlUf\Mc=]p4πU"m5hE77q\ID]oy<Y.Ym_QMBw0?-N8uM51[l.c\2(^7XfFLFD.5I^pttDwFDL4-$^πU"lXHK\**6[a3j'xco8Qo(T#0i2]Q6)u^5Zg'*2<$)>nw9c%zpf.K:Hhu-u^n.nhMπU"/rZ,I8'+24[,$m([[lkd.e3ujfD]%7zEW\hehjRXGufap6']voALo^*>s9vy59jπU"'HnvJj1BfI?#cqjOa'<O-MoZaH_*vlX0O9RGN6]_Qz][0)-Z9)f%iBuo)*qZijUπU"wC^0YMrUI+l-$(7m%D<-)+Ur*];mG8cn08xp2xJ'fS]k^'IGCZQJJs7)Tk-kfs\πU"???c)tJj=lBt<HMhQG$MI(q8r1/S?6nmoLE_0d16r'Q5f$*0qFCwq<NPj__Df(wπU"Tu&wbhL'Q:]v:9((=Xm/IYDYq1%N_*:x8#d<$AMdJjSPsPGM5z%eCb-O;XIt0l:πU"+4g)B5rtn&rlkZ0Ew]ez&K/-t^DnGhL;H/^PYEk/yx^A3\D09#w=IQ1g6n_T]8%πU"61g--7;NLd*'VQ];^ewm5mY>$>FCc8K6P(O#[bDt:wK.cfGf4RcdFL#Ap8/5n<nπU"-o2S&ih$,9[/O?ZJL7XsmPScjp*lzVMK7E0kmDu\$/?,<KE=-(D,[uZT?w$lPafπU";)EnUR8J0rx&&Ju0xr)Oq#e9_e3a58\AkdVA$g[By4edh(gI4x3]8<%0iU0Md^#πU"Fi;5Jh'Mz-a&'8ZF[Sj3o>mqS8Rfk]NEK7i-2oXI7dfOiHFYjoIrHbfSC7]jbpvπU",?\nfN=cwPYD(SHI0jSBNFmKo1oP/$:(;LOE,)CTg6[f-R*FRqC7,'Bn'fh.QxdπU"h0g9^HTXM+Q=DnYQ\rkkbxkr+&mD:'d(%\q'z&Rs5eck;Q:bJ)bec%9X++Mi>4(πU"wcvf(+(7\bo'r#sf*x$GRXAm9.rH,*IG5RrPgSDDAeO5R.X+SbZZxoO6?PW7.AwπU"BuHaFlf?[0&u.8S$kI4-Y*qS\4DRhNCgkJfnvXSgFx4]Sx)YE(S*s)+AP-F'+E8πU"Cg_hGV##j>?PWOLX+I^TF(t[aZsIoT&SEp,=.+%=(O5g*PkD0lUqoZ$T)l$wL5NπU"sM\/,'[0vdaD^^iMZU\.dK^jz09RCm1z?T$8B>CEjfT'<&Bkg$?wZ#jZwU[y9bfπU"5lX>a8t8SJphVaXy6b$ZJJJ+,=E]j#QYrMpe.&Jb?DSZM^q4nn:Su#e^_.Jny&<πU"ITYhq'$SFeU5$w&9KUYw31xqn<)4SW=9LUn2M6oI['Y5F$DY\U<dfMNI>NE2j0pπU"/P[]i,txZvLGf*.I%rYjPZ^Q^RoO:,):PIJiWW?*-v-C8cJ(If+2IJI]TXBi-UVπU"R7CBoExjOh6LLdoE4?EH&<'B[P*&5Bcj+7e2K,z*<9n(#Qwq?\Jh0aRCJ,-7YfXπU"-X-$t*FVIws/S&5aZ*#OfJAE-l'V/rLsTw_N2Saq)Wh#PiJV7/=lS:[H$]Fsrs'πU"Q)'<1Sl($7J)T[>enp]DRI/]Bw)lg(;1vR?gnoopo+L\7/UaqApn*#<bBmpos44πU"R8%T&e*hRE%fd=UJ8kZ9]PBQ>d$Va5jU=K2iWhtX=KOFfY4j'0F*Ug=R&a/.πU"wxY$kV0aD/lpdbE$&E3.i</A$fO-c;^t8c3+\5\,:UrhpC(+t%BL1G:$cK=5:(eπU"5I]#3DRzEO9aE5ERk+[^%3tpJ3,<ln6b.9ZRoF^$[;4'a:g%EI-Z$+hRI1/Tq%*πU"Gj:QCv(JrUyP>2R7:DMaI(]S6*sDUo:P_M't[U=:ec-<XYBqm),OLAU,25='HCkπU"FCm,0(9.7AR0<M0-Q:\[D.e:99DS;s\cAuVcDrbgY2?8\m$Ml&-FQ/%]kzeB>mDπU"8VQ8kj=WVV,g:z5RXpD'ba.ViQ7I;_pjB(:.kOb5bT]/aq$7T3*0sgs:O6iT5/uπU"j><a(ufn%:H6&Vi0AQctny?ZqOqaZG0U=VKf16<c+U;nS-qkXdfdKD4z&'UdKY%πU"/I(_'o2%PDebj.UH)R,L7-.#c<w/jv#N=%:+MCvj=;<5U%%G+.M:xvk]G<HHaBWπU"\_?A+#^hvGk8U7G-MmY<WxEPv$.'TO%(1vTZk)Kw<pX-o6Sjd[u(.-_=%_:$-4+πU"><s&iwGP'htz)sFN;Dh>(2u^$/h;X%;NGR_KuA;l\>T0D:lT=j:98V;KsV-0qNNπU"y0G=J];WP+1L2,IyBr-HYIwicd:&mG7QoZ9IDI3AFjsKt01otQ91GHBZH#jF^nSπU"]42%I1<TtF71N4%[-u3&'A(GCF(9+V#^K_5b5c'X)gs[t[Dj4-1Zw5e<j)#FQl2πU"#,75Of9D,r\w5'B0_(/4m3l'$q;&.m_X/Rj3$Bfb7c%P)[/F&]$C6LfI,bKN[i9πU"FvkT*_e=?=^]0]4Fs&eo:gFERaXN:F471j^e#JHSN:];gxvjw21PZJ#4rU(+uOAπU"%)G<\/#Y7B&la-MK*[Sfi5ls\JI0FSjXrB)f]m'8s9KQ'19RL[*SQ'8wBKDg;'MπU"BAm2u;>.8Il'=p1YlkP^<2f?3ePGqCE2ZvjQfC&p1Jd<6('*=5]na\U6#,]_wl[πU"6\YMnxH=-/$+mTS7sO08L%dtNGiHKH_26c0Y_l=(KsopE&wQF'T2nqB5sAjFkv?πU"7E'Jdc4o44TXWgKLFb6C>K&O:pF2xJnArm;T[\0D-79:4$c.e,*QN-FmVQig*stπU"Ef_ubJYRtuMcN$2c+,?GG&EmAuQ9.yOM*Kj;eQ8'H-29l*DSCS&ecDX?IK($IuBπU">Hi&5\Aq,6bXoi.Ex$u%IA;n]^:jqYkmb<'k%kKI5]saWVb>a=X0(S&t5Rq8z[XπU"sYJ&OdYPO;1;4>$0k+j?rW<k$;u0[BFi+L_w'=B$m&w2iG)0W\vCycb#tXhvM[;πU"9Zk#,KKn#D((,M9>IEuS022j+3gluFrlfoAhwGCZ8>-2'KLR_[/Aw*Ul,sHxJ0dπU"2g;K6+v8GO=;tWU'Q:h:'5&fGp/U85SF5$&nv/]GR4W3F/%R:Z>zVsSXv'dt/p(πU"((7HQ?&nCC%H9Th+Eu7_IoLjs<nC;puO8H>U*I9oi$:bq<07uXG4M3(YS=\jZb+πU"?kl\>-ZGP&6)-)G)NoLp.X]>5KFE_AaZVS9?)AUc%X0uWrLiV_;nI&8*iSS8X(KπU"3#YOv+j[Cc/]DvA5-A[e=BPWHjTg)&V?^ZuN//4*5ScUFR$O;2-q+n<Y#$lMr/^πU"s*'q)Mx4^P3$TTH(M>7<S:&;N?IfjEZ^_[\MF1fUfUo&2ZT<:;EbNpz$<501lTwπU"6<+Ms^uV2UN3:iS33Y*i(Os6kl/etL%QL<[t*h5L6rs%aL-N70fA9PG?kBsT192πU"7WW9qIp1b/A&Lq[Cn]'Ly%rLq;,$ALeIIl06.k,+>Kd>F'gdO7h8(]LTS4IJ6MsπU"Ft'r=;Sd4WUIITaj=,E2Db('mDI<tD/GeS.'#Z2F2?7VmYZx6Q644-fSdy#FEh&πU"Ns'$dg)1Kfb,25_ro>p0'WN#$3T,fqjc,b):$Z^S:%6+<;Pnwl]tf0kJ<WKiXeRπU")]>AlhvkL7/jp2x)5_Z(+;o&$A9*9]t]fikmD%\MI\fosdPuT.lq3pHQ,qhUNk.πU"LIG20;0<e+e3-H=%jhH'N?g_Wm2nm)#C2pYPeF3A<jW%;kuC_oAANzdR*M:?#s<πU"(v5vBFoKJbN=hq*7RWirV?EW#<^d%<)oq(Zw)4[OPf-:Vcw7gu;fRciS./ot[K>πU"1j1AHLKnD7I:Pwjk*aK]MYi]A_1B?r9^uVWeJCg=Ub;l;lK*4u?RtOGXBwt[3z=πU"p?v2v,YPnk.Ur.5Gs6rtcCrlT>>4<Vdc]p_nF<EXh7Dex0CZ&cgOx[I)>dB6kQ2πU"Ld1;-Rs&.1g#6='AX_rOoZ$miDI-Z)I3KIk&%#+R'+/S=_.R%IcX(\t-cKM9-MqπU"bvl:'YCYs4L<RYTOg5-o:JgiL(.KiPCen?]k4Fx[:iPWJbgD#?dU5WRG^j%NEt]πU"ERq7&)(t7OD?/W+NP#AQy6G:1<z'OC''Q._S$mw)N1t?b6>1XzL:EGhECKZBz;[πU"\[Gg/Q-)=iIwqOB?9[-#Qq9v+qY4\A991w#KwydAR]h5l>e7GE=>b7))t'UCl5]πU"?CSz=s1#xcr4-EE0,[x3HrS%($:C2jL2:0Y4Bn(A[P^\K,1c>&\SG=5R75-=>mpπU"yv41<-GQgZK9;nkWZxTu96((KrkG\*,+/cWrVHa+re_LiH5E6W/.chmY2,.12mEπU"]g6+gL&)66-C^Wsp(8v.9dKidhacHHhUJ)hrw&$Dt*j9o6<DCh=%[PU(^\-S':.πU"g-HqLK*J%sU3m[z=Ibh9lA;Q/+*#JX952QYcOggq:R*N#2?d8>+0RM/+yL)hQ(QπU"&Fgc[d_r&Pi9.=[)WOuQ'Sjz08*0EhVpY4jv*G$'20AGHYieL6m)DgOpxD$POW/πU"-(bl&0M\6IhfV*D%^'D(k4?ifV9F9]c]+I?i(PrJ9\?.q.5\2>&<k3.q%GudAF:πU"ut-G-nx7/kD/7Qe?qPDz#c1nr^'08^0kwACM;ZJexjbTr.uM+(kB,d5uTE^K]JEπU"],,p<Vb>QBMDotG6[Qg68^PCb&_'\0QZirHkkDg_KEqD=WG=R%YDkR;ZoQ='+W*πU"PK[+ht8u4fSW+kn6%bFWXG1-PQ+=Drk(NeNt?&#\(b?gM-8YQ^+8n3U?9<6G;>iπU"Dw+)Kd:GFGI?_lok3aY3)4(+TfhMaVldLdUo</98f0FXe.1<X&&m4otQ=,ttm'&πU"wRzqc.E5P5DjS-Z<[zqVMEDUGa<5:IMYeR&y_0(XL]m;R,RUSl_OY*HjM;\f*KLπU"8U,#Th*VaY9l+%Lqf-j#r+o)W->x7z2WML<\%r/1t5/XJDE:nY)^r1Dn'(*4W=gπU"8pTI,oB1-dtBq\q_?.TPa,ujpC4nM>s:^Jhe*XdkNmCt94zENmeWABlE3oY)k96πU"KkiQ-<mrqng>nbfmv-*qD,^'k;X6vUBTD]t8x\$VUW5b_T^*ALT<8Pd\Ts8pk+QπU"oOf>3dKLP[BifE]H94O,,F9IL^uzHpxd<sG(D'dLs2j*=V,*UginCQ.M\zNBWHAπU"ep\GaYYd$<F&1d2'Fbth*FraHUUV4:#P079c5<,+N2M6+De[ispCC.Hj.5amu?9πU"DtEF0wTHoPDT?5LV>(hR1dxEiH#3+R<>&o:%2=g2;n**UWM#n?EeE&:TOyYbdRpπU"N#5[RuLM%GjV.4X/kS18(USHJ0$)2gf:s$LY)4SK8i##$;:#eB4LI6k<1Z>WYk'πU"Ei&c^S/.B6]>U0Jh]g3UC.*PpeL3gPOm,Y]vDtLXHh-$6T7?BPYk=^S8EWF04V&πU"gCnN&iVK]=z4LBS7?SG)YoGNj2u9d.]lS)FeL8>)Ngn2q/x)rUQdF:Zr%s5b(C<πU"Uni2qf%^1v]n'mZ4t6w^HY=w^%VOoxT(DC]+=;FXpm/Vw]+PU]?bW:?K0ekmRrGπU"HNJdw.LfCP8%<[yPzdAECpx?7rmA#4]4D8_97b<Z59?B?kyHXqNlJL%9<M>XqC>πU";W-76sp62m2t.D0cv(l9+2U/EF+RMo6YF]%Kd<5_O0F?K+aj2vSay6C__l[_?u_πU"awQ:I4]*5&A$gz)'E9AG%$k.vRQ.T'otd2+q+TO]wDqA2eY0Mu9iDnK3ar11rvBπU"t:$n)eU7H6$(E22ML'[DOK'e=6Nbd'#Y[m6JvQ\BfjwA.8Gzq1<LY04S9lIcFD^πU"6Uy:+Qa1bXYW$<5J]]3f4hnWtn1k8Q-6>K)Qg;RgRoh'O%2I%eiZj9>4Yuh_.A=πU"J-esvY(pRQCo>-rBl)EE'IQRrD*p%Ye\q:Ny_Q/cFa((d93xJ+7[jc,QGP#VgwQπU"=t9er,Q]rog/_T)>aOwcRp1cyAQ#M21_SJ5i]+g,O%7pc,)f7/Do6%XaC=4To/gπU"mf(FWfeL28U\4i1w5It1\[jtcr5bq]sHjRMy/ineXq=JKrxsz0>I?d[j]$%/CL3πU"WLqu?AirVi2>?u3c#U=(ad#rLIEZ2QSW&6gdC:l)ehs272bUj$q0?TPR],nuu$jπU"'cuG>U(\VA)OGYki'DM>^=X\MFa2,_qW6qT=(p3mv*99cDDPk(k.(]3NSv8dt]OπU"6+k'\V.,gt[yCMz6e)+R#WE3%MG<HYPR,mm=2m]Y-.)YKZFj0*6X&1DYSQ,]XA6πEND SUBπSUB V3πU"o=yOd$O&yViIcA&[3k5eRD#Hwi3,B&mdLYfKm+eXo=CGC#>*w[s%>kr4WuUpCAGπU"q[8tK9*AfDJTS>c^'F_uP3HbE$,6,wQIWg1'rSw$b/,6aIXp5\p,m1#g8Vb01s(πU"am>B4BFwklJIv$.5d2]8G,s4i4)>e8,:a02#KC%%9bb+VaNn*a'#D8aQX#Qnm=SπU"6.$Vys=td>,p(p4x*)=>TU'K[zYfS0C*#(_&WA*:I>PpU1)OTHA?oE=7=7+M=THπU"0laEs1_l\e&d)6w3Ra0Bveg#RRzkBo09S_QMhKq7I[rO1UD]ck;#DuYH>1*)2<=πU"jdAl:sL<>UnY&jqq_g6Qt-,[0A^a.OKwGM-0K�W##T195\j^*;#yT(.-fBg(vπU"iBJxsts:>/vqLl0T0Qi8_]B.9OkZAso#I9#a/JDjE6H:\/2DU_q\Asx^,Af=UhYπU"/jG+Z)ZlEoho8RWaeuRVu%(-RrGb/N\5e4<0<T;Cr/6HKTeSthJJJt-r1QJ,bBnπU"rN('uy<bWXv&]pAySu1LyYnGI$Ypjj+A5ys6Tk^-=p$Ee1/:pAQnvK^uhGI7K+CπU"FC[/su7ZQj=pfB9J2;$vj8.DnC&RSWeuQ:9efV]o*2_51QkOk=p%ZdKQ7j,-TvwπU"Qk33[hXkQqAx'X_YQ5%W<t=MK4Cg2$0)\dR7Hhwp-m%ZyL>emiL:v,M*KTJMVSWπU"A&AFFD]Fbi4E+\m&,luYhmI=iOngMtL3RzY?Je+Zi^0Zc]sWEQ'iqE(AaN1n537πU"Mclad[414]2OEH%wmBykKusf.QR95FSddk&_jmf[InKgiBA__ObV-RNV0so:RDBπU"M8bsv^eS#=)6q9N%b5B9ofcHQQ8=>:_+;%Z-opE.I>A1BFWB_N82iU*A+zU?'W%πU"AQ\3'xYW)\Comdzo6.+v:yJA?Cg+_s%6mZDDfy#_mWY'LB9[kkXS.GbT\U-:t31πU"71I/V\;dI7.,x^fck:l;*mUr1E,X8[0,+OG)>vJVa3_vG&[P^r^$TrLg:v)*=O$πU"wvtjMnL;50?UmPEll2E0)rrj5ZmEvjM8)G7z%uj4[SE#naKl'g-gGUvpkLDUtvTπU"F52S'<5\DUm/jO>f+bY?/dl6p10Y?(>vyh6F)Fu4QDP^rE3+\m]a*LNo*Disz\%πU"w,(x;-WUVeFIMw+7[7y)Ka31=YWP;.imC:_CJY4p2^]Y*n(<Qa3\b[uM0--$D%%πU"?n<-n,j/'$Y+ms+$Pj(YI;C($_e>:FIjKYFs\1O6-9Vq7?6vaAm<p+_10NPiUiTπU"%AUgx,P6pm__#%7]_$PWcwVssLdJIR&;=$:NqPPL:hXwE$2IZ>h^9b(GOC*%QnoπU"Z2X4&8f&4C#?SY0JM&E(<:cL2N=9HU$Q:#X[0cW9n=EhvC#iKxe$S<b,LZtor>nπU"$yxghSkfqO5*NxErptuJ;[MKW\>pN,.',50Ad/b$3B9D-FvCZi&^T)thi?2XDAdπU"R7)>[EmW&H;E,_EZob<v*aJ>wB56rH8sLdwcEl%HWXK*5W*6jq)2R;$FOCn%.p8πU"-O1ZU3Zf&*fg+K6&lxE%u#YSy:eC5coN8E1d6B\U^2HUg'[&El21qj2:YcT*6ueπU"=4DmubCF.6>7t?4K[<(/?#D_=LD5(1&Lo:MUo(+:dB[>pb[;GP;<s<6mvCPG-GFπU"ABMl#v]FA7PCWTeT_G/nkx:'#l^KL]L)+>WKK[8(Q/gL\s#0MxUv1%oy:>kqeRjπU"gp3+=u+Z&n//ZX=cb(Kh<Lg7l.(^q6fn*gYz+$fT9m7VR5S'Kcv6SAk.4L,dMP)πU"*5;$TD6.E9(Y+(3T[Egg4[z\bNM+;)2mAaF\#))3a0VA]2K,aq=Q2_J\Q3;+g0dπU"5pr/LgQ9$>k=e)g(U<;\5LxP>](-tIf?X)9TmLGM_w-+b9ypKA9w'NFr;B2NObyπU"fDDu_FeQvn)$j:BnVpml:7m9%fo4M\$:ZA.p?ea6A,_194ES$LQF,)V\r9-Yjd\πU"Yd-OC0sSrpqvs)[PL-TTp4>[]NNZe=+:Fz4W>dZtYF06ba/,E&+S?NKpdj$bgSQπU"[B3O+1'(,['%Oi$kNZ&uC8Z1s79h6tTc5Xp(Q,iP\8JM3U?]br-=NnsrKnKdz-.πU"UESJmuu5/krrHmY_I#jT2F,uVkkE2[F8&Ji)*g-wZWd/h0GDbWgLgOum)pWz9B2πU"CPMR,68XODc]Bo6vXj=[a)#(.%KIVCyNKqe1s'*\Ft;Xg$_qTHkfedNiw50YbGFπU"L[Ql'a]4CtTxEAg_GW;?U1zO7BNejX=lC&jJV2aP3n12+ea]05EA<<ZKl-iBn,OπU"1q-md'>]Bs7F&w<Oji7J0BmtbcgsLDVIqNS[L*'1EvIF$\uEhI#[_+7*gY$.,5KπU",+Z_Odc7yXGmLO#[?iT+2'zi0GMD+EeQzz)CC<XJbxgkWQbKIkQU.#idS1Ra>E$πU"5?wXoduvbF7BPo6^Ia>[K(^imKNLbu6r:yN+q:8LN7thp/lc*bQZ>Z5-Jy-NA-XπU"srqPWW'#Wc]+Pa3_j_&:$Dy:siog2L0p/cq6*i6bwhYZ)ueh$ULiH7H;jjYADiBπU"PTcV_JKYf)hf-NsVP.tpac8OjGZp1V/+((Z,;4yWjF;7GYWoHe(*]z9<>wMBtzVπU")9&bg;'AHWc$Sp\)9O7\;%QK)2z&Y#H-)nUX:Q6*EEd67f9So;atBNxjOg3[.d>πU"9PE4*lsX'7PA:fSD?Y61:#.mW2^)96FOMg&_9HLIJ*(e2$4D,6DJc]-f3Jm]#)fπU"i#diZ$sHgb(Aprm-t#Il^,_&fWFhoD7'2]5&Oy0Zu1LIQXsqOJ0/>1V,47r88(AπU"7fTe'sAdmDeAUfS#/=r5pCj3wM=0jno1c'*FMA;BjOyFW=0#9xh?2'e/)%fXWDnπU"*rsMN.8Oaz5z.ixngck1Jkc-yt0Ie7Klef\;?VI'ETuh'MFU;p#yO:C*VA=fT?GπU"BbdIJ/V1to$yXtZBIYo9u396zJCpgU-HREqFGoq^1u&A>FS=g;e4_Tx_F/tJ6K]πU"<BfX*Jdl-(EB7pPsJC#9G[_EVQP8*Z,9B)HoE)#VfwbU]EGb+=<duQfDN>0kfHZπU"pmw5=q$q$$ng+UX^/q+ISc;sx*4RGzNe/0fT&S#[2acVj<\2d8]+D%0gI/wkj.XπU"o4Qr7&nb>2$G&^'>80EjHrfu2N6:*Y)W=Z;g%bZ(H7k%:D7k_tsDSYT[riSRZ8QπU"[KphKqWklSaW:RxI94.'tG(bMjbumbZ2b0(5H[zUiFvY>bqJN$^>2'%4FL<8eLQπU"3?[W4cMrL.=H2kc8s7Azv/(FK'<>f6,;5;9>MpKv,a2OZe\[q6'<tAFhUbF4Jb6πU"v5GJSSr5E9o'1u4u.%p.;='ebibesLJ\sVa)Aw9BlGtPQ^D>yBM;ICns^xv'Ee/πU"'N7qVnXI[b?&y+-GY0IdrpSfvA$2:kxqL-5WA\-)8lQi14(3)dmTTADOe.kq[&EπU"3QI]DUm'W]t3t.h_1>u?Pi&m6aWESj*&RBpj/[:I:c)=ea&n*Lj,(t>:sEh1F['πU"$tH.%lg6DVoAPQZ8v<U*Mz%.CP:GsaF.&K=o$7JfSCM1Pb0jeT4mKh$lj=Xr]rOπU"i#'isKAJ]KtLEkwWXWV<H^:KUofEopAl+W$<;59)q<PyWPqWNAV,?5qYr68DY9nπU"3&?K5IZc_GtNP5$R<fm4PiKQgi_F?U7qHxK=6Ek_/.]l6SeTp^2D0S1sG)9<62nπU"9Y'6cg#ApmI;ps]y,?_Z<0+7N9:'3N5r]CNu-oxOIB2[GJC2ykz,(01rXO-9>%%πU"I)*[?QUA)[]j*ee2.h&Lfk+5w0s'01%.31>e9s(6a7I%Iok+10):_8e3G(mt('ZπU"C2+mF+9wcT8g-h]Ds8xIoJbvf9\lw[;dLN]cvs#Rgfq^R,eY\f4%1=EX?$Q\U0VπU"JWcv?RM;9GTRt$MM:sIG,DM7dQeCdyoXiac(HrB#V-fVPDd0M'sP;ditcZWSHCpπU".Bk$[IewpBewz?+G^l'bJoCQf,H;w'#WC(=tKZ=g].9fG)A]StMSqwXxis*iO/(πU"mJeZ$c5EZJ7eSZac)%?(T\j-hqObjfkb%)#f33tPV:Uzw9JXSh*'k0jRXZ'-N0pπU"0llQ*&-ZmXnp\]QPI21j11Y>q8v&2#LO#Xf5okQQsCH0P%fSu/(1id9M7r;rE_CπU"RGbTMhJQfnAEzJnb=b<C8/*4A'8R4c?7pbT<u5$voa[(>kh=%;JMaep/N#'g:c&πU"s=t.K:hW=Bt)5&(t)d[XF^A2IzPDQeT.lT0XQp\JfnN(VabHPGLJVm;b6d0s47PπU"LaFMfd<.7X0]8#,^QCG\GLoZ?UL1%Jm*f7#,dZfM8-86W[;?9GMMFt0Rd*;ohG=πU"lBDTvPIdwe.Su(tj=5TMPZ>oD,?K2npL-u<0/>EeMSYa#Yt>-8-9_Xu'MRiBH\hπU".vX2#inQFHub:dFuUYLU*9(78IF\d0WL1QZ7h=ZN&_t[Saih+K+?#Dr(sW][i)9πU"q>3/v?#8x>eMbK7,M^?heVWWXHhn5_dWTKQ'+DI31;i]>f1h'-FK2H\eu^ERkDWπU"NpQ#VBMHCxu%V0H).<ih6'$H4T/Y#t%RZXS&(Kpoj0n_ysBmWSE4Xii1\:lXM13πU"q+G)Qj1Gqp&:*Jt?:,u]nrTQMDA:g10VT]73y=h9E9L$jt3r8*v(I(>$m\Jh'N7πU"V#MIre.DFSa'=TIHXgu%)iFut3iFuB2fv7LL3dDj).mS[(_DKw-LUk8K-i:\(gcπU"Q:tPts1bKbHEilDx=Y]wkDLiq3HHt%e%r(vzZHIg;v*]1h'DlKr?b\\b\8G/0.%πU"=.9pk06H7)sv/Xv,Go>-S1%8mO5xlbndDu>NV.$M)?31tkVs1XF8HAIigTfstwIπU"iboDX[;,JgN04yRPiM3EEEcHV\8b-P.G?-lm<BjpoI$.D:\P;M/apKFcDU<0:P5πU"^jH>>:O%vRTR,L,/u?L^uNZ4$ZnjlKpTF84*dUg%G\?4<XQq*Hg>J(kFU5t,hG1πU"7\8+9Lgma;3<-KjNCdU)SaLgHO>vS,WSsBiw(u:^:_zZsXKsJSso8A>l[hjV:Y>πU"\q7kKXs^mYTxlSm,5+mtab/1;[lbTT:dbqn+mj[X;58XRX4En-OTQdIwyOd<;9xπU"Exq<c.cKe5,0Zn.)[.%m:NvT]?Pm.bo1)>b2Izy4C+snz)XL.ceMpOXZG[kH$*KπU"f#>$]/z>M0J::l&uT#)P,#:1-I)RkG;?PEKw&mpkBGiCa?%6W7srtxM)rTR6LI?πU"&F%HVn'KbM:jV8%mf%eO-w=KPdgd/#]OKq1nP^/]j&uZZ]:5-bl0r,h_$tqPsLgπU"$V^(M?QbLZV]u\9W-6Ol*Y.13B)'my3OsHkjCScdiUbC\zYC(%4.)u-N^No<WE?πU"#g9Fq>h^uw,6lU0#[Wc\qc]*&LUg2VQAc&,D3Oa0.uMf#xK2I73YF8_w&RNOaJ_πU"rKsaN&z*b/Rfo'sFTJ8Si+TrUH<Og_iI))O&V=xr/oVS$cg>o]1ItQ;+g$\$qNMπU",4UVv/EFTRTA[KX$,pXnvFtnVeE$HP\lUx%6eUtKPp-u3drE1>p-68Pt\nApVq:πU"Lz\0AD_6kHt7Vw38.=i&C-sIS0h%R6\I_4Q:(;;t*9ub.1abnM]v<I#0wPf6'V9πU"Ys;oMP=_r0kWGF\6s_?4.Uq5')e#+3L)zvwQ?w_]yhA5eknR*:YX(1i<)x'O:bAπU"lLLtxmJBEE1WN-&[9<5ZN*0p.vnYr?tp(7aalpH$LD%kN5A&*N9b_HJxaRYzbb8πU"/'FK5gAysL0by932%/eSs;kR,PBb2Vq^6Z._far#3_AP[Bb,4ihE\<VnHDwKtN<πU"qa%eN[W+3tfIC8CSb^s6s<S*?/DoJO]lo2QT]o=O*pnF<HR=^iRub6gUTZfo6JkπU"<oF1orv671,%qCgceu,AghN9AHSa?#IjdOU\9_YQI*5vib+?.D(x\wur2t0p4YXπU"+t6J/Jk,,hE=,#LlGaBHxb+7e*Q^+[nW.GB)aS;Gd5Y\c;.cc:^rFI&2Ck*T.ZjπU"oPrXTXaNPY:%K>[fn'aHgviT8or4#^d0%]-'dQQ$QqL/p2-=Z=W\<qGHaM6'w6=πU"kC>Ee>VrD92Go5$h=?MDB-P)>5IEj46qluHsn2*?kNot<Z#97KrnSS+AR^EkMkMπU">ES=c0_/vRG6P;(7.U;m5hIhXv7Y&PgO?Z.P$Glnf)P#r;Y$:%jYf=;kA-$Q5'0πU"d:/ZVD(i2JFKE\3.*?\0LCW:ltxm[u(9l9nhxllTRwJU>XE+z&C_ZPUzw1-GsczπU"vlK5J8oL;u3p\Ui2nLT>[:Hr(s(Bh^^)ftR<kI84Dl7UxKq*_CFTX=8)u.7;AujπU"oTvPD9eMLar1##_.q4?GJ/0jP/e&J>SEy9riON]lrrckCm?rl*jr4:9\7Cu>#o8πU"Ml0*hQ9Mt+c7TQ<7X*O.$Kj4Z31;d^bnbSfren\IA89C3pVK)os2A2t-]<GsZ_8πU"O,7Cqhg,qwTm&*k8XO0DE$iF+'L'&U\(in%zNfY#iUbDrRf<fnV5J9Q$#$VGxLDπU"2b<VPHl-4,]m)dg=NVq$Z8Dfpt*i['7hl2tFj7dfKqIMn24*3sp<wmDovk-^$?KπU"8h7f/_s'f0E0rZjPRP68\=M/h=gBV0vV&doQ9PPUB>5fpki=>rSW7^oR8CCAlHXπU"OORPW?^WrX2n[To(BrMnN4d;kj&KsYW3YWP5oFYMLtZHs(:J6Z^X8PevBhQf8%2πU"ox98H3su^)Xdvgk6q;D&D+zzypz'831'>u33\J&tbt&TfYM$<^i+.n8kI.I,i7EπU"66u6w$<pd=hW0Od8I>x*68j<'-8ENOB.sCvV6MLpNa7m&S/9gm#+YCJYBLv;G.*πU"SW9NcKxS;T^0ddCEaK1.W./SRq-abcgrOaCOVhk[D,km3(0$Mt%qrB>>Z[<<?ZcπU"o[L;sl9T9uq0EtiD$JJCm&d)MEeJAt7:)um*cCAUljH1BjR9y?XTj*>z4=LcD8LπU":=<Li4uQCvCu]uW<6RJVgYn#iN+2\+04X?9Ss%B[3&Lbe$fJhjmn02kmI5,qlHaπU"7y$C075XTEXd[\V.1\[w3PlLG2an-27)=RGojA_^6$B+tGRt,hdFvf?ej[su)W*πU"yzP;WljYqu[N4(Pr,E8m+wHjlJe.<l-?9OX4*-LG#c'jVi>YT[<11-^2:5an_-CπU")JzNPk08Y8;rrV(-M%dSFi?EKhPI'MS[Wo=E0a))juai;%&kx_#P>D78)lHhQi9πU"B>1w+.'qF$6Lf=PHLB3\3mbau-p]c*b2b50M1=4\x^NoF_dLpwC%m5phY%G<^rYπU"o7uYW$I-cu-yQ:E\Ioncu$$qXf??LgWwk6-MO_?srn?f5ZMgGPe71lUZdaqL_BbπU"Bu)I(jlr$PX$)rY#usmu(KIGxowzo$(s3)tB6YFc?(oQ;[2npjtB&<9E?17NjJrπU"DZB1YgydduNn05zMIaEduB\>b)0%=zHx3-.l*FLi=MnKUhB'HiJ5&&pArG?D-tOπU"'q0O8Q;(Ts/Jqr(PXr00.g#B>G-CgLdlmXa\hUB?HH.;lPO3TGa6A=)<QeuO2RcπU"$gr=?llnQn5%)G,cJC5KC]1#U[UFR1<a-lEc:]<+lCIP%ObSXut'r6CQ%QxhI<7πU"rj\?Uu5r$??#).NI\&_D%?8.%(EHUZMAq[-FMSJR-l'qmB,jGRCn).O/TFAMfBOπU"Ra?jbQ:;kXCes:O9\9$E0kx7:mug;_P/%-)s9dFM&/PQ-6ZJA6iJgnZCn<=U;emπU"Rc%vH=..$crl]f2(n'\]qs[S16(MWI]d>wif20j*IK[qSdh*Zpz%AtLz^dAy?YFπU"&q_G-;<tRCwsm$.GjY9.NwsF'Idup%()9%%%%-%'<o]F\v<aZ&b'%%&H*%%%6%%πU"%MC4<?ITx:DM;;?DJCS10DBty*)>jU9tM0]x;?i/PBRmjWK+ZwlBMIsR(o#)y-bπU"sk803jrut#RYXQhQg+K3rJgm:No2GKX^nm4cl8_f#1\0-q%vskBR1++(38;'MT9πU"C6m^nE\Q^.5Q83QuI:86;Fk#H_+cu[Rta?+Ba4Mh%]cJx=[,V%N'J^cYGPgc6XRπU"^1O't]H#GaN.5A1Q&MwDUUevMRm(>Avn8]-oBqSzFs%y#>kh&fJ,.byieT9rV=tπU"yNO-cVvq,'cy#=&,fnn2GQcBqXNw3D(DQGQS0S#nV779aSIa\sCQg[pC*iZE1^:πU"u'(v'=%9:j)*Hj=z%6f.G.=5?U&Vh0]4K5j4%K<_I/e)Hf;N.q,\e'agcd)o\aYπU"t6?>4-D>gBi,oj59Zs7tMRoo^jZsAo5-bCZ3v-2s(S5S(;&Y[+O<0N:LUkDc[BMπU"%b*9&jVOju.Z3:eC>YWZ&S_\Qs%FI:-aoY8&:VlolmLuJt9TaA.'>+ZN:dYdD9*πU"E)$MUHabPmP4.30n*_yjo*R29V?,nGicr#ER/bg&<H$\hM.<N,cO*gi7AJWS)?TπU"_YHl*;JUTpkGfnV*Bxr4U0isX^U4P<f/9REtA'f2npRh(%NE%E)6E(Cc..?+-_]πU"N>1c3WA_^MBC#ANt'S4U9ag&5)e]Kow(2pcibwXEedM#Q_4IxIR?C7j(rm*g<CqπU"trLk_2>Ut47Z5BZMp-Xm(5=mfI8>&=$X_^a?tqlTJ87F&<UEXXih3Cj3wQ>;OXXπU"uEx[T/5HbEq8v<Z>KJ5A'knxt;kp0d:oeoY,g<*CBEFk#+,Bdvu+i=TNP(U#%ACπU"&q<KsQI&4)Zc*(.FtHDqA&7lEx'%up&'%W09%%%%-%%rh]F/7PN>%G'%%&[0%%%πU"3%%%%%%%%%&%E%*/P%%I%%C4)<?TxM:D;;LS?0;%up&'%W09%%%%-%'Jo]F#IG-πU";&'(%%'A-%%%6%%%%%%%%%&%E%*/Ps'I%%C4)<?TxM:D;;2?82S210Bu%p&'W%0πU"9%%%%-%r#h]Fg][L_v%T%%,'s%%3%%%%%%%%%%[%E%/,PN*%L%C4<A?Tx:2D;;SπU"2?82u%p&'W%09%%[%-%<#o]FvR<aZb#'%%H%*%%6%%%%%%%%%&[%E%/,PwZ%L%CπU"4<A?Tx:MD;;?DDCS1)0Bup%*+%%%%%)%7)%o%7%%9]%%%%%%up()%9%%%#-%h1dπU"\Fy53%s?(.%%d/%%%6%I%%C4)<?TxM?8A02;4ASh10B&k%T=S.e5Ll'[DkvgzoPπU"CB4=,*M<tU_9=/*6R5Jfj1F=Q'#[WiS=a]T$l,oIjJTMyijaQJ_<+BG1X(.n?FcπU"k+Bo$&'$0Gb+*?geCDL&z%9\v$=f05%=D]$#DH/RUK'8>(l2]u.HiG/t].lq)HmπU"^('-TQOTp.]xCb5_/VLQtTH)n8Qr.wH&13+WnNN(m(SUj9FN%\Je)+v8)>pkcv7πU"(%>,&m+\2/%s8zjZPWVMg]9Y*7(Ed9U#kP:GKRDgd:U,<(S&Fq]kS^TIBQ#nfUTπU".hIc6QQE5apKi;5l+7n(;q$hqCUgEa'tAaK=1g+S1n[l4))lc3M.p*dv8EmY7-iπU"GmADjJ>7;%.tvacmBhK5((EmTNp>wVslLPFQ87,beL^n^%B&ZfrG9*wy]K'&0NcπU"<5a[jfV;Xq,E*&ZR-nJ]TahnKgf;P.w&Yi+4lv7YDd=nTSj69>i%*:bJM#Ru8\]πU"(R$oI8ikxQubPk6X+W.%oZaQ%;zdp-Pejz%+orn;8.4KutB#\2<\J6nHEjEu_E4πU"uqWjp1ef+0R[S[DJ9Q^%N=m$8qRrs\hosZEc5rL8?GhpK^^X-)Y'U19kCQZFm7LπU"p;KW*uJ-HUTGi0]$T;Z%;CGDj<#CjuePO)hI]%1=pW=Wqh1QOYZgP>Awsbo?r=5πU"&29u*EC%e,G(/W5?./HXXHS;LPA'1F6L:mgG]OI8.&HF6f/8.KD%:^Y>DyF0pC)πU"xuYP1tu;i5pvjrrQB=$+x.C<?F.ID-bcSn3JYtMuq[u/$t0oF:Tan';qzqgp/[hπU"Tnt.Q7n..1;c^_wOf6b+Suwi=7F*h;OxaImhPOYv^8?cS#MmMoA'%2^KR9Ue>uAπU"H6R$VocLubF1[9_N)J;Ph(dAhP*EE<a2WDuY)&#A*K-B]w-&*S*tsL+aG#pz:?^πU"_&aF/sp0psSO.<Fjbw0A4p[%eOP6bjbr:sLnQz8d6k:iS%PXZGAT.Fne*gFd)c.πU"/\JmW)^eMx=qE4>hB;>Rg/4hM^jIHOo*\h0\HG=COHfYTh=tif,dABxDY'Z+bQKπU"D?\\YP5+hl0,Uh*A.+2GT9=Q;adC%6MxMdxM&a*w]s/'LponLPpq7>_C2DYuqhIπU"13+Fm,yw*u%p()9%%%%-.%Q8\1F3*q+lm'%(%x-%%%5%%L%C4<J?T%>MAC4GIWSπU"10GB.z,,>Se5tK0]x1UXy+e)hL$/^%9Pc.=v%1wWOYNfrT^T=NQ$mV/utWWl8<5πU"qotgV/JoEM=E>'k.uW[&SBez?^[d6$lr<['wVm=DN-UU<XPh,h;v00kNi1q=6TjπU"D(I^1Tsv5j*,Z/14Ov]nl8l&,=_-Q2l/E.Q)kMY2DrskD^7Nfq#T:?#75^$L'=4πU"4$E'o[Qk4AfbE83-;IH^WJ-3E&ScF=xk:O.'QGE.0?6I89z7QH0N/eQM5Wh5BSpπU"sGN)n5i&ac$YStJD$z?+&Czjzs;\2\%qf1zr2A'VKb7.IEpyWmRQ]YM*#yhRRp(πU"f9Ska8&>ddRA[Fcf#JA+1xECy89-I4A/9j3_-#7ErO9O&5,c*,aTAwgITWI:(uAπU"vh+<I6.w_gezw]NIt;]MgR%yGOCy$1jypYddl;,3A>y7.Fwv;IubNoG6rZs0W')πU"2;d<EpF=SrYG0WjR.[NUjU<ZNS?ICr>UZgMGXJMEu&H,rPlTEw>.?9Cu+u]*53LπU";%E>pornT1N9=B.ug8U(Cw'Yv)nQ;q4*p64KX_BU]nXHN&iUA<#o[iMEr.,'V2yπU"G>Tv1&HV2/^>:uIr;$f^3m3&Jk+qY_BnuX>3eX\rEvDv5QWZ9;6cu+G%AFDD(i[πU"4cdykgVsRjo?a=lw+Tq;RGMp4Cw^.I2Tt=?.F+^>Q0]L;AqB>olc3D>xSA(qBZ2πU"tBZCfxDV+=oWu6<U:ri7R#D#.c-tO%z6A,nK%bdW3$cHcCn77Q#Ql^[L3_K#mSDπU"]O,'*R?qm&yN;Pfk/tpXtSyG(=mSzOVa5THb7i:Gs+zoOO'nwHt*wzoc9?tD9E#πU"e/LS4&ps7F<5ol:F1nr&N%oq9U4bWKl9lhMBM6?:#H].dT.GJ<<+m/C&N&ZB,$_πU"=$6fm(hkUgQoCau]^NiUC/*oc&cMNvq)qN08*KEa(FtuG#i.Pl=[^xU$s3[4C:,πU"zd%dup(%)9%%%%-%o%r]F>E/^Y&[&%%4%'%%5#%%%C24<?TLy8;42A=3SM10BLGπU"$VsRde5Th4\RF]A8YReU?768]L[Vf&yi/);7qWvC?*YTgi83X3W(MGM\%=eX^lFπU"h6,I,D=3PmEBHWA]fjCn#,,m&0]rcnXO^dY<SaHsYpI6:;4<;P^='IVIc4PQDOJπU"W]YG*Q&61p:TMjs/f6=#<I]Nl>lt64+-)Cg:JKTG/E/U^0HF>e1;u=Vk0y&;mXLπU"b_^n/FSOs7HR=bY]$0q$$aC],0gu/s9==Z(T^O[9o%Ax*:A8aPef7nGdUU*1]jDπU"STKgW=Tp_R0U54fMCZ([O(?a.9e/46EEHc3tDc^UgNipaSC=?&ccWNk>vT41.;;πU"7?_*mGi(I#FZB#XxLF7;r]ka-buN[8GRWPQFI071(9x&lKDnH<RldHaxpla1w2[πU"E19-hi5DKuXCW*B>LrMx]Z%*JpWoA_W8v5b)N^h#5?4'#>,6Xup%&'W0%9%%%#-πU"%*7[\F$g/UT/)%%%-1%%%6%%%%%%%%%&%RE%/P%%%%%MC4<?ITX3<M=C<>JAS10πU"&Bup&%'W09%%%%-.%/2[aF.g2(OD(%%%m.%%%5%%%%%%%%%&%EO%/P^#)%%C24<πU"?TLYG<>2A?7S210Bu%p&'W%09%%%%-%)%q]Fit^P*u#*%%s%<%%6%%%%%%%%%&[πU"%E%/&PW-%L%C4<A?Tg;M3?82D5GS1)0Bup%&'W0%9%%%7-%?pd]F0h2XwY-.%%nπU"<%%%6%%%%%%%%%&%RE%/P&,3%%MC4<?ITl85LW1B0JES10&Bup&%'W09%%%%-%%πU"Up]mFerW%.l1%(%EQ%%%5%%%%%%%%%&%E4%/P;#<%%C24<?TLl85<20GGS210BuπU"%p&'W%09%%[%-%F#.[Fg^*A;][&%%p%'%%4%%%%%%%%%&[%E%/)PZH%L%C4<J?TπU"8<M064BLS10B%up&'%W09%%%%-%(XHZFWBVj]'c)%%&/4%%%2%%%%%%%%%&%E%3πU"/PkJI%%C4D<?T:2A03S210Bu%p&'W%09%%#%-%_B-UFw^^UvA['%%<%-%%6%%%%πU"%%%%%&[%E%/,P*O%L%C4<A?Tq8M=4;0AEVS1)0Bup%&'W0%9%%%#-%697\FB):?πU"PR'7%%=-%%%6%%%%%%%%%&%RE%/P&wR%%MC4<?ITu82MB2A>J;S10&Bup&%'W0/πU"%%%%%%%3q]4Fc:s+(E^%+%E^%%%3%%%%%%%%%%%Ej%/P)#U%%C24<?TMB:D;J;SπU"I8&?up&%'W09%%%%-.%h1\pFy5%)s?(%(%d/%%%6%%%%%%%%%&%EO%/PwA9%%C2πU"4<?TLx?8AM0;4ALS10B%up&'%W09%%%%-%(Q8\F)3*ql'm'%%&x-%%%5%%%%%%%πU"%%&%E%E/Pl=I%%C4D<?T%M>AC4AGWS1)0Bup%&'W0%9%%%%-%or[]F>//^Y&&7%πU"%4'%%%5%%%%%%%%%&%RE%/P)8#%%MC4<?ITy8;M4A=3LS10B%up*+%%%%%%2%2%πEND SUBπSUB V4πU"%K(%%*gA%%%%%πEND SUBπV2πV3πV4πCLOSE:IF S=243AND B&=Z&THEN?" :) Ok!"ELSE?" :( Bad!πSUB U(A$):FOR A=1TO LEN(A$):C=ASC(MID$(A$,A))-37:IF C<0THEN C=91+C*32πIF K<4THEN K=C+243ELSE?#1,CHR$(C+(K MOD 3)*86);:K=K\3:B&=B&+1πS=(S+C)AND 255:NEXT:LOCATE,1:?STRING$(B&*50\Z&,219);:END SUBπRyan White                     PLASMA KALIDA THINGY-MAJIG     BigFoot@InfoAve.Net            10-01-96 (08:33)       QB, QBasic, PDS        56   2654     RNDPLASM.BAS'Plasma Kalida-thingy-majigπ'By Ryan Whiteπ'Press F1 to makes something wierd happen....π'Otherwise, have fun with this.πSCREEN 12πRANDOMIZE TIMER: CLS : DEFINT A-ZπDIM c(255, 2)πON KEY(1) GOSUB chng: KEY(1) ONπDEF fnx = INT(RND * 3) - 1: DEF fny = INT(RND * 3) - 1πFOR n = 0 TO 15πc(n, 0) = n * 4: c(n, 1) = n * 4: c(n, 2) = n * 4: c(n + 16, 0) = 63: c(n + 16, 1) = 63 - n * 4: c(n + 16, 2) = 63 - n * 4πc(n + 32, 0) = 63: c(n + 32, 1) = n * 2: c(n + 32, 2) = 0: c(n + 48, 0) = 63: c(n + 48, 1) = n * 2 + 31: c(n + 48, 2) = 0πc(n + 64, 0) = 63 - n * 4: c(n + 64, 1) = 63: c(n + 64, 2) = 0: c(n + 80, 0) = 0: c(n + 80, 1) = 63 - n * 2: c(n + 80, 2) = n * 4πc(n + 96, 0) = 0: c(n + 96, 1) = 32 - n * 2: c(n + 96, 2) = 60: c(n + 112, 0) = n * 3: c(n + 112, 1) = 0: c(n + 112, 2) = 60πc(n + 128, 0) = 45 - n * 3: c(n + 128, 1) = 0: c(n + 128, 2) = 60: c(n + 144, 0) = 0: c(n + 144, 1) = n * 2: c(n + 144, 2) = 60πc(n + 160, 0) = 0: c(n + 160, 1) = 30 + n * 2: c(n + 160, 2) = 60 - n * 4: c(n + 176, 0) = n * 4: c(n + 176, 1) = 63: c(n + 176, 2) = 0πc(n + 192, 0) = 63: c(n + 192, 1) = 60 - n * 2: c(n + 192, 2) = 0: c(n + 208, 0) = 63: c(n + 208, 1) = 30 - n * 2: c(n + 208, 2) = 0πc(n + 224, 0) = 60 - n * 2: c(n + 224, 1) = n * 2: c(n + 224, 2) = n * 2: c(n + 240, 0) = 30 - n * 2: c(n + 240, 1) = 30 - n * 2: c(n + 240, 2) = 30 - n * 2πNEXT nπFOR n = 0 TO 15: OUT &H3C8, n: FOR m = 0 TO 2: OUT &H3C9, c(n, m): NEXT m: NEXT nππx = 0: y = 0πDOπx = fnx + x: y = fny + yπIF x >= 320 THEN x = 319 ELSE IF x <= -1 THEN x = 0πIF y >= 240 THEN y = 239 ELSE IF y <= -1 THEN y = 0πc1 = 1 + POINT(x, y): IF c1 >= 16 THEN c1 = 15πc2 = 1 + POINT(639 - x, y): IF c2 >= 16 THEN c2 = 15πc3 = 1 + POINT(x, 479 - y): IF c3 >= 16 THEN c3 = 15πc4 = 1 + POINT(639 - x, 479 - y): IF c4 >= 16 THEN c4 = 15πPSET (x, y), c1: PSET (639 - x, y), c2: PSET (x, 479 - y), c3: PSET (639 - x, 479 - y), c4πPSET (319 - x, 239 - y), c1: PSET (320 + x, 239 - y), c2: PSET (319 - x, 240 + y), c3: PSET (320 + x, 240 + y), c4πPSET (x, 239 - y), c1: PSET (639 - x, 239 - y), c2: PSET (639 - x, 240 + y), c3: PSET (x, 240 + y), c4πPSET (319 - x, y), c1: PSET (320 + x, 479 - y), c2: PSET (320 + x, y), c3: PSET (319 - x, 479 - y), c4πIF v = 1 THEN GOSUB colπLOOP UNTIL INKEY$ <> ""πENDππchng:πI = I - 1: IF I = -1 THEN I = 1πIF I = 1 THEN v = 1 ELSE v = 0πRETURNππcol:πscol = scol + 1: IF scol = 241 THEN scol = 0πecol = scol + 14πcc = 0πFOR n = scol TO ecolπcc = cc + 1πOUT &H3C8, ccπFOR m = 0 TO 2: OUT &H3C9, c(n, m): NEXT mπNEXT nπRETURNπππ' -1 or 1 routines:x = x + (INT((RND * 2) + 1) * 2 - 3):y = y + (INT((RND * 2) + 1) * 2 - 3)πDouglas H. Lusher              PANNING W/256 COLORS           comp.lang.basic.misc           10-09-96 (14:03)       QB, PDS                321  11708    256PAN.BAS  'Some of you, I trust, took note of the code that I posted a fewπ'days ago demonstrating how to create a large virtual screen inπ'SCREEN 12 and pan the display screen over the virtual screen.π'Shortly after, some one posted a request to have this implementedπ'in 320x200x256 mode. Well, it can be done, but it's not reallyπ'worth it. SCREEN 13 only has 65536 bytes of memory available andπ'is already using 98% of that - so there's really no room toπ'expand in. In SCREEN 13, a virtual screen could not be any widerπ'than 320 pixels and the most height you could add would be aboutπ'four lines. By contrast, in SCREEN 12 the visible screen areaπ'requires only about 58% of the available memory, so there's plentyπ'of extra space to use. One alternative, if a large virtual screenπ'is needed in a 256 color mode is to use Mode-X. This is what Iπ'have done in the demo below. Since Mode-X has all 256K of videoπ'memory available, you have room to set up a large virtual screen.π'Unfortunately, the memory map in this mode is much more complexπ'than in SCREEN 13, and that makes this mode difficult to workπ'with. On the other hand, my Mode-X code is for 320x240, so youπ'have square pixels and don't have to worry about adjusting forπ'the aspect ratio of the screen. Anyway, if you want it, here it is:ππ 'this code is a demo of how to set the VGA to 320x240x256π '  mode and then create a much larger virtual screenπ '  and pan the display screen around the virtual screen.π 'by Douglas H. Lusher - Oct 8, 1996π DECLARE SUB XPAN ()π DECLARE SUB DrawCircle (X%, Y%, Radius%, Culler%)π DECLARE SUB DrawLine (X1%, Y1%, X2%, Y2%, Culler%)π DECLARE SUB XPRINT (X%, Y%, Text$, Culler%)π DECLARE SUB XPSET (X%, Y%, Culler%)π DECLARE SUB Screen320x240 ()π DECLARE SUB InitCharSet (Segment%, Offset%, CharHeight%)π DEFINT A-Zπ '$INCLUDE: 'QB.BI'π RANDOMIZE TIMERππ DIM ScrnWid%, ScrnHgt%, VScrnWid%, VScrnHgt%, BytesPerLine%π DIM APage%, CharHgt%π REDIM HiNibble%(0), LoNibble%(0), BitMask%(3)ππ CALL Screen320x240π 'the width of the virtual screen in pixels:π VScrnWid% = 592π 'In this screen mode, the following must be true:π '  VScrnWid% must be equal to or greater than 320π '  VScrnWid% must be less than or equal to 1088π '  VScrnWid% must be evenly divisible by 8π BytesPerLine% = VScrnWid% \ 4π                π 'the height of the virtual screen in pixels:π VScrnHgt% = 442π 'In this screen mode, the following must be true:π '  VScrnHgt% must be equal to or greater than 240π '  VScrnHgt% must be less than or equal to 819π '  The product of VScrnHgt% multiplied by VScrnWid% must be lessπ '      than or equal to 262144ππ 'create the virtual screen:π OUT &H3D4, &H13: OUT &H3D5, VScrnWid% \ 8ππ 'put up some graphicsπ CALL DrawLine(0, 0, VScrnWid% - 1, 0, 1)π CALL DrawLine(VScrnWid% - 1, 0, VScrnWid% - 1, VScrnHgt% - 1, 2)π CALL DrawLine(VScrnWid% - 1, VScrnHgt% - 1, 0, VScrnHgt% - 1, 3)π CALL DrawLine(0, VScrnHgt% - 1, 0, 0, 4)π RR% = VScrnHgt%: IF VScrnWid% < VScrnHgt% THEN RR% = VScrnWid%π DO UNTIL LEN(INKEY$)π   X1% = INT(RND * VScrnWid%)π   Y1% = INT(RND * VScrnHgt%)π   X2% = INT(RND * VScrnWid%)π   Y2% = INT(RND * VScrnHgt%)π   C% = INT(RND * 14) + 1π   CALL DrawLine(X1%, Y1%, X2%, Y2%, C%)π   R% = INT(RND * (RR% \ 4))π   X1% = INT(RND * VScrnWid%)π   Y1% = INT(RND * VScrnHgt%)π   C% = INT(RND * 254) + 1π   CALL DrawCircle(X1%, Y1%, R%, C%)π LOOPπ CALL XPRINT(8, 0, "Upper Left", 15)π CALL XPRINT(VScrnWid% - 96, 0, "Upper Right", 15)π CALL XPRINT(8, VScrnHgt% - 16, "Lower Left", 15)π CALL XPRINT(VScrnWid% - 96, VScrnHgt% - 16, "Lower Right", 15)π CALL XPANπ SCREEN 13: SCREEN 0: WIDTH 80π ENDππ SUB DrawCircle (X%, Y%, Radius%, Culler%)π 'a routine to draw circles using only integers and integer mathπ 'an implementation of Bresenham's algorithmπ 'by Douglas H. Lusher, 05-09-1996π A% = 0π B% = Radius%π D% = (1 - Radius%) * 2π XX1% = X%: YY1% = Y% + B%π XX2% = X%: YY2% = Y% - B%π XY1% = X% + B%: YX1% = Y%π XY2% = X% - B%: YX2% = Y%π DO WHILE B% >= A%π   CALL XPSET(XX1%, YY1%, Culler%)π   CALL XPSET(XX1%, YY2%, Culler%)π   CALL XPSET(XX2%, YY1%, Culler%)π   CALL XPSET(XX2%, YY2%, Culler%)π   CALL XPSET(XY1%, YX1%, Culler%)π   CALL XPSET(XY1%, YX2%, Culler%)π   CALL XPSET(XY2%, YX1%, Culler%)π   CALL XPSET(XY2%, YX2%, Culler%)π   IF D% + B% > 0 THENπ     B% = B% - 1π     D% = D% - (B% * 2) + 1π     YY1% = YY1% - 1: YY2% = YY2% + 1π     XY1% = XY1% - 1: XY2% = XY2% + 1π   END IFπ   IF A% > D% THENπ     A% = A% + 1π     D% = D% + (A% * 2) + 1π     XX1% = XX1% + 1: XX2% = XX2% - 1π     YX1% = YX1% + 1: YX2% = YX2% - 1π   END IFπ LOOPπ END SUBππ SUB DrawLine (X1%, Y1%, X2%, Y2%, Culler%)π 'a routine to draw lines using only integers and integer mathπ 'an implementation of Bresenham's algorithmπ 'by Douglas H. Lusher, 05-08-1996π A% = X2% - X1%π B% = Y2% - Y1%π DX2% = 1: DY2% = 1π IF A% < 0 THEN A% = -A%: DX2% = -1π IF B% < 0 THEN B% = -B%: DY2% = -1π DX1% = DX2%: DY1% = 0π IF A% < B% THEN SWAP A%, B%: DX1% = 0: DY1% = DY2%π I1% = B% * 2π D% = I1% - A%π I2% = D% - A%π X% = X1%: Y% = Y1%π FOR I% = 0 TO A%π   CALL XPSET(X%, Y%, Culler%)π   IF D% < 0 THENπ     X% = X% + DX1%π     Y% = Y% + DY1%π     D% = D% + I1%π   ELSEπ     X% = X% + DX2%π     Y% = Y% + DY2%π     D% = D% + I2%π   END IFπ NEXTπ END SUBππ SUB InitCharSet (Segment%, Offset%, CharHeight%)π 'this code initializes the data used by the routine XPRINT toπ '  define the charactersπ 'Segment% and Offset% are the location in memory of the bitmapsπ '  of the characters.π 'CharHeight% is the height of the characters in pixels.π '  CharHeight% may be in the range 8 - 16π 'by Douglas H. Lusher - Aug 2, 1996π SHARED HiNibble%(), LoNibble%(), CharHgt%π REDIM HiNibble%(4096)π REDIM LoNibble%(4096)π DIM Mask%(15)π Mask%(0) = 0:  Mask%(1) = 8:   Mask%(2) = 4π Mask%(3) = 12: Mask%(4) = 2:   Mask%(5) = 10π Mask%(6) = 6:  Mask%(7) = 14:  Mask%(8) = 1π Mask%(9) = 9:  Mask%(10) = 5:  Mask%(11) = 13π Mask%(12) = 3: Mask%(13) = 11: Mask%(14) = 7π Mask%(15) = 15ππ DEF SEG = Segment%π FOR Char% = 0 TO 255π   CharPtr% = Char% * 16π   FOR Ln% = 0 TO CharHeight% - 1π     BitPattern% = PEEK(Offset% + (Char% * CharHeight%) + Ln%)π     HiNibble%(CharPtr% + Ln%) = Mask%(BitPattern% \ 16)π     LoNibble%(CharPtr% + Ln%) = Mask%(BitPattern% AND 15)π   NEXTπ NEXTπ CharHgt% = CharHeight%π END SUBππ SUB Screen320x240π 'this code puts the VGA in 320x240x256 mode, and initializes theπ '  character set and the bit masks needed in this mode.π 'by Douglas H. Lusher - Aug 2, 1996ππ 'begin with standard 320x200x256 modeπ SCREEN 13ππ 'change the CPU addressing of video memory to linear (not odd/even,π 'chain, or chain 4) to allow access to all 256K of display memory.π 'using the Sequence Controller, select the Memory Mode registerπ OUT &H3C4, &H4π '"AND NOT &H8" turns off chain 4, "OR &H4" turns off odd/evenπ OUT &H3C5, (INP(&H3C5) AND NOT &H8) OR &H4π 'using the Graphics Controller, select the Graphics Mode registerπ OUT &H3CE, &H5π 'turn off odd/evenπ OUT &H3CF, INP(&H3CF) AND NOT &H10π 'using the Graphics Controller, select the Miscellaneous registerπ OUT &H3CE, &H6π 'turn off chainπ OUT &H3CF, INP(&H3CF) AND NOT &H2π 'clear all of video memory (setting mode 13 only cleared 64K)π 'Do this before switching the CRT out of mode 13 so that garbageπ 'does not appear on the screen when the switch is made.π 'using the Sequence Controller, select the Map Mask registerπ 'and set it to write to all four bit-planes simultaneouslyπ OUT &H3C4, &H2: OUT &H3C5, &HFπ DEF SEG = &HA000π FOR Ptr% = 0 TO 31999: POKE Ptr%, 0: NEXTπ DEF SEG = &HA7D0π FOR Ptr% = 0 TO 31999: POKE Ptr%, 0: NEXTπ DEF SEG = &HAFA0π FOR Ptr% = 0 TO 1535: POKE Ptr%, 0: NEXTππ 'to reprogram the CRT controllerπ 'remove write protect from the registersπ OUT &H3D4, &H11: OUT &H3D5, INP(&H3D5) AND &H7Fπ OUT &H3D4, &H6: OUT &H3D5, &HD     'vertical totalπ OUT &H3D4, &H7: OUT &H3D5, &H3E    'overflowπ 'select the Maximum Scan Line register, set it for double scanπ OUT &H3D4, &H9: OUT &H3D5, INP(&H3D5) OR &H1π OUT &H3D4, &H10: OUT &H3D5, &HEA   'vertical sync startπ OUT &H3D4, &H11: OUT &H3D5, &HAC    'vertical sync endπ OUT &H3D4, &H12: OUT &H3D5, &HDF    'vertical displayedπ 'select the Underline Location register, and turn off dword modeπ OUT &H3D4, &H14: OUT &H3D5, INP(&H3D5) AND NOT &H40π OUT &H3D4, &H15: OUT &H3D5, &HE7    'vertical blank startπ OUT &H3D4, &H16: OUT &H3D5, &H6     'vertical blank endπ 'select the Mode Control register, turn on the byte mode bitπ OUT &H3D4, &H17: OUT &H3D5, INP(&H3D5) OR &H40ππ SHARED ScrnWid%, ScrnHgt%, VScrnWid%, VScrnHgt%π ScrnWid% = 320: ScrnHgt% = 240: VScrnWid% = 320: VScrnHgt% = 240π SHARED BytesPerLine%, APage%π BytesPerLine% = 80: APage% = &HA000π SHARED BitMask%()π BitMask%(0) = 1: BitMask%(1) = 2: BitMask%(2) = 4: BitMask%(3) = 8π DIM Reg AS RegTypeXπ Reg.AX = &H1130π Reg.BX = &H600π CALL INTERRUPTX(&H10, Reg, Reg)π CALL InitCharSet(Reg.ES, Reg.BP, 16)π END SUBππ SUB XPANπ 'this routine allows the user to pan around a virtual screenπ '  in 320x240x256 modeπ 'by Douglas H. Lusher, Oct 8, 1996π SHARED ScrnWid%, ScrnHgt%, VScrnWid%, VScrnHgt%, BytesPerLine%π HPanLimit% = (VScrnWid% - ScrnWid%) * 2π VPanLimit% = VScrnHgt% - ScrnHgt%ππ X% = 0: Y% = 0π DOπ   DO WHILE LEN(INKEY$): LOOPπ   DO: KP$ = INKEY$: LOOP UNTIL LEN(KP$)π   KP% = ASC(KP$): IF KP% = 0 THEN KP% = -ASC(MID$(KP$, 2))π   SELECT CASE KP%π     CASE 27π       EXIT DOπ     CASE 52, -75  'Four, LArrowπ       IF X% > 0 THEN X% = X% - 2 ELSE BEEPπ     CASE 54, -77   'Six, RArrowπ       IF X% < HPanLimit% THEN X% = X% + 2 ELSE BEEPπ     CASE 56, -72  'Eight, UpArrowπ       IF Y% > 0 THEN Y% = Y% - 1 ELSE BEEPπ     CASE 50, -80  'Two, DnArrowπ       IF Y% < VPanLimit% THEN Y% = Y% + 1 ELSE BEEPπ   END SELECTπ   Ptr& = (BytesPerLine% * CLNG(Y%)) + (X% \ 8)π   WAIT &H3DA, 8, 8π   DO: LOOP WHILE (INP(&H3DA) AND 8) = 0π   OUT &H3C0, &H33: OUT &H3C0, X% MOD 8π   OUT &H3D4, &HD: OUT &H3D5, Ptr& MOD 256π   OUT &H3D4, &HC: OUT &H3D5, Ptr& \ 256π LOOPπ END SUBππ SUB XPRINT (X%, Y%, Text$, Culler%)π 'this is code to print text in 320x240x256 modeπ 'X% and Y% are the screen coordinates where the upper left cornerπ '  of the first character in the string should appearπ 'Text$ is the string to be printedπ 'Culler% is the color in which the characters will be printedπ '  Culler% must be in the range 0 - 255π 'by Douglas H. Lusher - Aug 2, 1996π SHARED BytesPerLine%, APage%π SHARED HiNibble%(), LoNibble%(), CharHgt%π DEF SEG = APage%π Offset& = (BytesPerLine% * CLNG(Y%)) + (X% \ 4)π OUT &H3C4, 2π FOR Char% = 1 TO LEN(Text$)π   VideoPtr& = Offset&π   Ptr% = ASC(MID$(Text$, Char%, 1)) * 16π   FOR Ln% = Ptr% TO Ptr% + CharHgt% - 1π     OUT &H3C5, HiNibble%(Ln%): POKE VideoPtr&, Culler%π     OUT &H3C5, LoNibble%(Ln%): POKE VideoPtr& + 1, Culler%π     VideoPtr& = VideoPtr& + BytesPerLine%π   NEXTπ   Offset& = Offset& + 2π NEXTπ END SUBππ SUB XPSET (X%, Y%, Culler%)π 'this is code to write a pixel in 320x240x256 modeπ 'by Douglas H. Lusher - June 15, 1996π 'X% and Y% are the coordinates of the pixelπ 'Culler% is the color of the pixelπ '  Culler% must be in the range 0 - 255π SHARED VScrnWid%, VScrnHgt%, BytesPerLine%, APage%, BitMask%()π IF X% < 0 THEN EXIT SUBπ IF X% >= VScrnWid% THEN EXIT SUBπ IF Y% < 0 THEN EXIT SUBπ IF Y% >= VScrnHgt% THEN EXIT SUBπ OUT &H3C4, 2: OUT &H3C5, BitMask%(X% AND 3)π DEF SEG = APage%π POKE (BytesPerLine% * CLNG(Y%)) + (X% \ 4), Culler%π END SUBπDon Schullian                  VGA SCREEN SAVE/RESTORE FOR PB d83@hol.gr                     10-07-96 (17:39)       PB                     301  19851    PBSAVE12.BAS' Load/Run under PowerBASIC to extract PBSAVE12.ZIPπDEFINT A-Z:SHARED K,S,B&,Z&:V1 'Created by PostIt! 7.2πSUB V1:OPEN "O",1,"PBSAVE12.ZIP",4^6:Z&=14590:?STRING$(50,177);πU"%up()%9%'%R-%/iIiF9p.=0Z)%%%w1%%%0%%%%ht%rufw%wSirOt&%.,>Sm5tN0πU"]h7UVIeKG5j_9-IPk7+TM2j=DES*]CTIGg=O/b3Azb?PCbsPysC&Wbmk?UwngbQπU"mj5EA<Unw/)Z:.uHgEul_h]BSVhI3p.?vp>8fs8BOQLIa<=2<r,iiT(stom=-ltπU"wT9Y57p].gxYHQ9.a4Qi%p#O8P,Jn,&U[rbDgA-+GXf(PFHb]+\is;no2J4,P/:πU"_)rNI=o48D=Qkhf$=(9d='0X:,TR[4pLHr'fm$9T$d8^oMmJ'OSiXer.G$2f&rvπU"iQnwiXO'%$XqIg(k)'^iK&poLu7vpoFVOl]oozP7.4te-HH8167U-?6;SblMJmkπU"#N=CEojd#?#U<8U[E^Mll\S8AE5&0Yv*WhDTO*bwd.RE3sR3fF#].4)vVtYGX;mπU"UA&+6k:35g348,?k^jCDSRT^NpofeHVeAj(1cjlXCT7ak4-hheC1jV521>?;l-lπU"M$N_J(KbW5RM-t\8>D:j\5Y3%whPtSLnGg=VQWRS/WMnGQX&E<#])b0X[,X&:I3πU"4ZI>,(Pn,hLzrRTbIM2j?EZRA+j[K=%z+s$4?KN;(G#s6=+]KoLR7Te,,HC&mh(πU"7LD&;2gejTbQ+zBH$l/cHY$<osMY8=:]]%sXL^Aa1D[vR^QAC.qd&#oCvAs6/EiπU"gRq[mg1+QnAy/&?Y/r2S&;Ugn3uWNBZSVCCiJBiqYa>Be$XU/mh)JE#lrD_zO7#πU"uG^jtlq+m(7r>*0UO)Y,KXj^(:yIH#pL_#(u2DsnyigfWM4bC;HICt8:tdns;+BπU"ZQ*4U<?o3OTg1KzDA+7HnqlTH37KSMBD4cNu%wJ3J21:EaFf%k-%pc%%4BD5uMCπU"<B:i(uxm9'bLo*^JLO:5tPy57-MeM&wY+Q'1t$G*Nz3+q$tLj*nc8I5<B)/ubNFπU"5y7J4G$RKuUksA2BeMx&7CWV1AvugR1nMT0d3rg<EM\BPoR3_uGkX*M,X1yW;LwπU"B4Un4Q[B?xH]Cv7Nhi5FmNi-sN)q3EL^a<JF$78%:?r3>GqR]ps:2X_WJigv0WmπU".(CbC.>2=O,ps>=Y5[g+a<k\uK29NVW2+]\#/_eXxTY>3+.nrTobR3&Mkb2ri:ZπU"dJZiez=O2:joFEBp#GjQRr]+&&$Rqjgr^]VBXBD_]h4BfB2WObJ5M<a.n[nZ<IPπU"XB3iB3chJQQXaV_fHbHk9[6K)1R4C>qoXhUoN^Y[ON7W]ThRLLCpFbFoY-uUfHWπU"'_f-P<qjDz>A1gu^^dxuZ4JeD<))sS5eS#RlT$9-_a?a\OZTEhQ$p+U2pFJoAy(πU"tfO_^>,U0<6eW*W/;e=8\JF$.lF6eM6C=2*'xnGQL4V1okh0\9wdjZiK_(I.KckπU"'LP-qgqm8Kjl;61V%Q\5-0d(E:6B^MtaQLNe(Ej;9aDN=,aMf>E9&/cjSDiQ'[bπU"$/t)D2p7+NR+mS-4&/#;b6-YDRT4-3u>x-VGUoCvYj$2+',Og]#9Dpid%up()%9πU"%'%I-%0e.iF,l)Zdb(7%%c.%%%1%%%%lj%yuqf%sjSiRrtFd<X>[k=5#XR<rNqOπU"0C:wmKG+iUdmz3iFK$/[J4#t&Qn>StA'Z[)RTfu,s^.KbkmSbs_cVop?M8]CC$:πU"Ec+0UJwCODQpTnWlluHEwiJ0aQpn:Ett<v-t2tJED_t+-%9P8\uM&+xoIWl5\/AπU"*f[aGjpdF4LqLl=sK3*cwQtnJz7;6NLTWNdCpgFi_Xi2)tsF$4PW^q-\AUN9dofπU";d<sV:6.3[aUT(aD^QfBTTVCW=dE,ZF?q<VL$omaX?'No?PxR(Y*YIapAa]oz$qπU"-Ah3j+xbZA-*FYG%Vz:bZfy40##3P$F3k)AwFt;GclFf[y5ils&]LYUVd)t]tX,πU"tL1tdTg^e,>poRjhGim'4BkC=V^C&C?ujrCta<#$hJckPlp6-9ZGYl7cqko=_a2πU"=B.-H$rL5tWS\W;=?VQ.D3U&h6+EwRvk_?t%HQk&=?)U&v_Fqq0D*gJfN%TAUS.πU"Kvka7P1vWpS7SF&-yvhMtW.*&:[_d.Tk5S]:8cZ\xi[SFuA1Q4U0r;Ga$j+^_j1πU"1%u&(Z,v5,APbeU>Clwo<FOjA=CTS&nt(o+UVQg;Y);*V#22lO&b&78+Uz^O7<dπU"UqQ-etSZo]l_pI58NaP/'9hTlIRa:bxJ4,HAV<FAlMvo73\u%<qj[/o+;^XT4CTπU"uA=3OSAYA5CwTH^[KAI)E2cpHu^x7xm3B0V-bT1,lp0#X.24CRk7t[2pU:3OTg)πU"35s$V^w^Mjr,lR%K_J9MpMfSU[N[Ke>^qbUjLnxv:PD7k?9ELDAfDp;y83gwKw_πU">%#X#[PzgFz-SyNq9;g;u#(k$DiE8L;kvg*#AqpgY\s]FGNZ,?4]Kpqqc(a^1aVπU"o>Q^J26#-?\qWqP/Rg+ljOOcDk-:lB\K=&eI:+]Io85AM2qjD%P[Uzccr?2hAX7πU"_>#CSEk#qu4/CmswWe=&1rJ1KbgS2ZTH%o.x)o>C+S[+h\&hJ\=K5gdaowVCQsfπU"K3u.E-ZnL-d<bNbV?]h7un;WWNkF6&B0if_Vz>J]q)e[3c_+D;S<kl.8[;B9Jm^πU"0-96wP9,#w(u%p()9%%'%-1%(jiRF4UY&eB/%+%bA%%%1%%(%%lf%Wknq%jSir4πU"t.'p>BTA6l7,Yx&phv[B20vK3a0HR)&PIM&0j'Qp%a^UCEAMq%1'/Cka.NDMxs9πU":LtXzABkFzJTCTR2*36U%Vw&-:#,_-kZbw3v<8mg>cM6*-nz:9$CdnDL0w3^a6LπU"iUj>LNO,P?V:Dd..0w&)-1z^$+I>EhNb;]YD4Q+i%t%WxKUz986YEl53\5ED4'lπU"2RR,?*rSkBofZvWuTc-0TSb-iMpLQ$=cO9u#L?omgBx,s'V?sqlq2?kl[/GxlnDπU"l$7XowQ0JCL5A<=+/iHexhhJ=o98^vd6TB1fm>t[r*bmt--t.8utQD0GM$Z7t3ZπU"otiy\d_0_NWq)xV%-/M3tEN-j,8L4+dgDQfeI[Q<R$s'eo&yj2-P2\5gt;xqP$$πU",S8=8OUKf-'LQ4neZuu5VCilJZL>C0$=+,=0\R=G_6G0>GgT0c4(UF8<m;v1S.sπU"g?(j-('9?_IP24\3T*0SJgY*oQpe#f\s/=;''G+;#-,*'N>kl0BANj'#**.=;0)πU"EBafAg8e[WtG7HP*avDxI<r.qg#XNDXR<ClFR6%D-;u:<=3#Th'-:IvHatQYq*oπU"<KZ6_wSd<VZ'lJH3b&qhQo&+T%r1D942kgZQUY(cs7bX#;vrnp,TXxoS<?;21rQπU"I$$9C$ij's&p65'9Mq8hAWo]2I)wolSA$QCVV=iYG_s=^)=92B05Soip9vV'F1YπU"_Y?^4W0kb3hPk#[-fKDio3DgV#0Pmr=0A92E%'t*keDAz:+8:-\=:=Z5DH1AAZHπU"\=\=7KYm$Z16,5S;)GJl8mSTT9r;FBvU(E'4ma^k(IK(M1fGuY';Q%H.ul(G+=sπU"$'QS#;Sb1DA'ePl%VIPfUW>ZQ#f5Ka=NKZ3#-#]Kk#4eq=)\>o/mkzU+sY/<Dt/πU"Mg;^s9jDiO#f]S++GQO-bK:*H/>huR+[L/5c9+64/HkA:Z:[0;F1DZSF0k?ZV,aπU"4^5bIM9ufFpi7m+IaC*A$j6Ip:YA=*Wk'1l*4/B&<P4HERe6C_0z(W,Q]H+F\aYπU"4q[O2j1ugO/EG$\h8(3fEr7n5Ya_mNLK6%<,krEE=B<jQb-wFWi)OG;V,[6pN1CπU"Z<O[]fxm\ZjG6I*)IEo\*li/u*9UgL\SPSXQR2G?LI+E2X\r]&hU>HgR6xsAL[BπU"[c:6sJN:Tf5$4)6YK=wa&I6_r4Y3Kd9rQZ$>&Q^g?RGkMZ\_b[nAI=^*IUktaT]πU";ia':>h')9R>dIXONIRq(_,Gb/_E6m'7l%L->#y_9-4hgc)rI.'IfSQ[_fa'P10πU"PQAT54-#rB&s$5+Xg^+2Z1PU*&,cELG^21G*k_Vsh5+&urCV]LQEEJEfE$zC(cTπU"Q+M7.u*iQ65plllU(4w-pJvuMvN&oMumCfpN/u1K=hHf0Y0sR9YQn*=k#eRd\GgπU"vD:iMEVS5/%)?J[s\PVrj?)gdQU&aBjsLMNNu]ElEHMNR[Lo6KKK=Pv-8nn\x&QπU"7(pL1NaCzdZ:Q'%FQN=i=8vH?a]si,2ydpc7&$rx5rL=Ob/B<tSv<[4Z)3SsX\;πU"C9RFA[q:U1an$Ea9$Mp5z6C?iW)WnI6u(ev2rh-w.;nkRUMstYSn.x;B=ELQNpbπU"C9VZ'Y^LI;SXU#ec:;?79F7A[%g$H0J?eVZu'P=>MXB30AmbK4kpI,s/vXRgd7=πU"Vs#:.\D*6lPHwa4:Maqplg$:M.6B(->*lKx^'XiIi6R;F)i:NWL6R6RF?=4tbktπU"TMNeSR7m$o-NVuVV+)F9Sfp/Rq7D)TEC79Sz3m8u5Sh&pC/fJ*SI;[3yl\P)6LGπU"%2xp\RA].D'\-N;bh-vtF&RH8WCib5:8fAx]b^QK#+<$n(%3;b+)/JloOLN7lVAπU"NkF^V='Rj'Dx=L6Ap:ug1c?#xbj&Ud[lS\QFj1t1W'jFd=.IGMz%3+\RuWmEIK2πU"%ABl=)]S+p^oMb5Of7xEc;t1M3tAL2^'.p.vvCW6K&Ja\(*tO7_tObPm%Ap-rvaπU"2OZ[)_Dt3T*,l_x=TM/LS6BYQM>7;Bs942XfLHvNjPi#-*6O'J=;t2cBMsX=;%[πU"-tN^kZzDL?)iKNwy41=rUqhM,kL:[%##&g2KouGU(#YsAUQ%aFOz]7*nOa\&-u&πU"J3$T/u]dox,w:j%FWPU]/%&2:RUjs6irn^D45YGHn^,0E=$DIQ4zmP^R[R9xcP+πU"EfFNVs-V]922<MC/R*FEqp-\#G,]Xp-t7*'%F8;blNB)_$^,0R(hTsgxts$mmXSπU"rhuJK#i;mixR.4-+P9BgZ>L;^))58]n6.6>p_eA_:U=]UDSC4IC[O&oqD]5=[/.πU"gq%gVx/2cfF0C6,02QIEyiD[:?a56;hA4LLy8LwxfX;t5iIMj<_=#&Ur=X4Vw>vπU"d7weox)E=9b,V2Y*>j-f.Z2<GCfBb3F4nrX7oYjRF8$Q3<^Krh]blVc=Q]9cEMvπU"UBXI\48fLB>N6<Z.9gCf9C*^yCnP\r/(9WxEOh_=6I%wI^HyyR3U*oGMt1GYo*\πU"[MIzu*y3Vh[=gD92nabiUAC%^rBL/vUrD^T\Rq2zWaugl6BqF4/wF[vY<72[+KkπU"(&kal\jllY..;&>%&5aHuV4&s7p-IZp>>4j;Gh5&quNguLuc[:g:Sdfvh51_t9JπU"xqa)PG=Y<2x?qEJm3E(eNMIvY:D,nXvk]G^LA/tZ<hg^h5dOAhok8xm5\g#=Gi1πU">8cfB(B/hM37<c+WudJnC#snX_6\%hV\ztl\#_Rs2V(Jn#gbLN4tgZtCTZouUk.πU"*0f7s?jRJcak-F=F8pHtGA5n,k8^MmG%b/QVCD:qc['<LT.^5p:xhM#E4#gYh+^πU"aD/v0J??,25DC/_gr&nS[#ok3\;4j3'-L#lR=]bXxwMdx(w3_.hm<nphqI6I;D7πU"JcnnLJ)A=-(mVN]_DgUKRWBcAn40EHCPU7[e6g<Y,*3aI290:HkC\Uib8N%(43JπU"Ajh7l,RwXO[7k3L9i0g2F:Mob=;A6LhDhnhg>w$uqSs9_H;=cA](9j4(8ot+5u=πU"d;R196RG.TSq%K>zC3n8?V9P8Mkq5Z.Mr6Bdbw5GE<p\=3DvZ=#J4SO4DPDp1N6πU"qGDtuEFm,(#jgDr_:)U.O;l[t6.5O?E?rRtHD:TxSAZc7/t:Q]^xcy71,Mc5LqXπU"b>%vE?>UrCG\9l4b>&z^kX*h5*/bD,wX<[6_g.h1eM2(naRfe&MYGjkhdc5Mw^qπU"5bfp.Sz.t=t4=/4?8F-,G<4&5u.ES%MFYD0MT]<Hd#eMc03#nrk8]g5+r+M:S5>πU"FSr]1da/x8r)$x[JY\UV9-^8up%()9%%'%-%(EfiFmS%Ct'u'%%'f,%%%1%%%&%πU"lft%stkk%Sirt'&zrt]Tq575*kN=Iu5oU%MNwPFMmz?QO:\(alj+C]JI0*U?;],πU"O8^FtS9J=pgO$I[CuXxNs.#GsO(l$o<7W*GcfGalTEX,:,v]DhazP%fWHC'L8V^πU"O3RlaSx$4e&$Wdd0Y:.87;8OkV2q^4*xsZ49HI>Z$:C'?Z.BN\j7qS6\A#d>mw;πU"<;5xAm.;4n3XR(iNy:NkD%i*Xr9-;='-7ls52X%a$MVFUo2HPnZg]JW1'X++d+NπU"GpTA/22U;\UF%0\W8VhX0HCiNyKEf5;#tO:E4.x9NuTFnhudP)DPSf(8$x^tPmoπU"aatQ#3u:rDdTPDJ_3=G.hfl)3nu+q]8[SVqUV<p5'54:V,C;%z83*55f$3Q%M%pπU"?b1VBUU;#7Mxg:C^-puFEH5>1c::0?[5+A?&01HTk_35Q<'Qx,YZH5QTlQBjDwzπU"A#C>Hb]hY/4nGxTYBZpNm4;e#+&9#[]MJSM[t^D?&;#db#]+f?v%bA9fm+GG(eUπU"N-I&jX%327,(w%'Z0:*q.yNJoI07imcA>1Sd'smQmIntF/b4VfY,?COt<7kCU^9πU",Pi%92f'OH[0rn$QFV[gU(6&Ed[57lgC*M=Z/TQ=*.E+0I3DgrUdG^mWhOJ62jqπU"ZllXM>xg37KI.7&P3Dhx]a'Uz..y?Y6)T^OZ^-,\KjW-'&_b0u-.]'G]Q?;ad]3πU"RC\2;lj*)_W0eci$Rt+,J?C(GC.^D;r#wTIZggQeYpWeCcHuxg3=Ap1TF7wed98πU"3p&)v&Y,kmdG4l;E;qMR+L[u3&)TE'0dHZQSpAHAC-lD;L)2jKkBI+;D(,l:KAOπU"5SghVF^&(#g^;<b$<wZCInRUof^fU/TiwQBVNdCsN,e%.w_Z>oGy6DCwmldf)vjπU"Ij:^->FefffYFlXUN3:'%d/pr=GEB1kE*N4dcdNZ.'Cv4dsqcTZs=&FuIM>P)s>πU"W(\-YSB0dvoMb5R'D-WdEa.%up()%9%'%R-%KddiFi+(oz4'%%%q'%%%1%.%%%lπU"%fWkn%qjStIgoD$:f7Lu==#8I5<S4#0LBVQFi*-2bYFf*ZASSEsq/'%aXluS)z6πU"rBLG[]1-bkeKFmi]4Pv&RQ)q8*N?'f+o3/(0#1C5hh4Q>O1^)VI7r-GmiscqwhuπU"pwXxr\tG97eQ[Dq^Tv;*^gT_#68kLZgIQG0iG=O.W.?LppPprFx2#;s&X-(G,GbπU"BB9*%a:GG24/k&.YS0>Q=dq+QXQ%4fSBFsa+He#qFA7O=lDmk/1H$H%fd;t0*+PπU"mt'>O^%205TWL(p>-a4t>6u;o6wM0Yl#+DTlmoaZgCNVcWk+gt#ZC*TChR/=xIiπU"qPt#tlu(hmL+xO[gy92Q%30F(&L>R'D$b?.kJ#[pN2:\s1bD1KVNI_[3RzhkNcSπU"i4bh3]*A1yxU5heAzpBOX5pK[SRtI+b'i0yh<(q2z_VC4(C<E)(7\7tF^^ziz9)πU"ZR:mQI1EOj'AK6iN>pTd=?y21;I8;mH=M1fTqxhjvQ;7m(:w0A(CQr4w^Mt9*q^πU"n_,#g*agb$X(HQ'HMl07&Q\O_i,=[zl3_NRQcW+IW7iDJfWgutWHSpAWa1sU-tDπU"5eR$6Jb#,c=&n5Dx'$Y-:v?MIl3]^ivy/lIOvr&D8/+?-RL;tz0n0JRYz#b;5BtπU"tPRB\?Hpb/;0T_\Kr_];\&q8fIIA#EZ,?9Hj.xhq%<up(%)9%'[%-%\#wfFWSIqπU"wS#1%%X%Y%%0%%%%h%truf%wwSzRsy^)_*>##^:M\Y3x?Y+)$SwO%nnkRB>VMaWπU"*'IsOeC\ldEUU4u,[?DtlFG%jI_>2&7&Le,_Oe#DoMM_kvuami&B5o?7,5IOgToπU":RM12B:SBG\Z$/tmodelw:b_P4;>:(djhFD:h=7GOSh33?;LGIk:saFDo,*6G\cπU"^GtTw\,O08=3ob-(&wY)(Nn2_0f*ZDI6iC07bKqG[85\egTtsLqv:qMz2X/;nxVπU"u0PiJ5/QVvE$8D8'#tT_&b.AaU#,;j=qBRWutxhXYd'0Ai^jST_??[b(q-y2XH2πU"ng.4x:C_Hmpu++uca^UiU^M%$c,P.<u&-CfsSs80D26D:1[+*r>wA^7s<q?L:YZπU"[RR?rITWqD86Uyu\ov4YN74ZWd:><ttR/\jL2Lpug''(aI0\KgEbZj$-N'4Xb3PπU"4JZEsk&Rr)&CL30/#c*7U;3xfl8KK_Ygys?J2hCmsCtoXIT:R[$*)r;chQP>*5TπU"d.NLcI<AFzOswnWgX5*q;NMbNu]r]s-kJA1kh/=3Ei;Um\%'\6j^bJ.cj[/soY7πU"XGm4+\2xP8T,iA7V[ViA%sxKS*l0;^V]c*Wi1OhUB5%)_MOr'ucMvoW:<B[<N.dπU"UP0At'n*BixvlS9&d9aZn*]k5*R^;ZaTiX$FA.P/Pl7Q/4\oqHEBRZRCBnLPMIpπU"k]UvJaoLfZEPX^1u*gx51L?4PNJQdh6,-]Y3*9dG;1-X8Yx=/F>$,44$2+SD(IjπU"B?V)i:MfQtTA=u-f/*0X<.#pIoXo&al&p(mM-&jjif5(?b%.a.n^UFRYqA>M$.2πU"YQtB^L:e:wwAP4cch_GKB*,992Ze\;7-2o&9#,4JmW4E$$TsEqRGv)Bi0:m'O*;πU"*nplRtyi0l9i588M?+8\gf$$<FGb'uiFL#o/+?DUDO=4E^Vgts?Lo:L_RZb&2%eπU"lutl8XR-Z?u&i6MFQYhmZrq6rg^&/a',(4GL1WN$SlWonY#J;In6=TwI>gK6=H*πU"EolXC;4+aN].FHIN2+A^:a*[7MEOP<bjq%u<7r;8*R=Gg0<OJ;^(%ur:/Pn7RT+πU"6GLKbkPQ109hz<H,7o8KT7G\MfFIkvRTm5bY(IF2AG?UuY&=PkaIh[+moplRb:hπU";sQ=$qMkk-#1'hS5$F,v0'KBv0-g'd0:m=%wjs8<twA+-vp3>IiV$8?Bq5kiRPpπU"AzFXs[&Jgl,V(Oq*Wwo0B%^.X7JUMV11SioNSqALPoZ%0Ek)XyP;AsH6+7+<KaBπU"8qslj/So#l9vgP^R<:a^VIQE1Cz#Lj:h,t8K''\Dw:qMGtf*T>oOq/tr&HutK,_πU"b,D[tTMF_sF-SqSF)FV(r7c]lGvuxkiF53,uNcc/_<a3Cy+1x4'B0(A'-Cu/vi(πU":J,gEbNs#x%GA:5\G+3GcQ7ieY$RS+'8?*l^4UX*'c,%MM-Jq-^[TIveDTcTA1xπU"8RQ;w3kCrn<P2qN>$Y?#4tLQR:^FTp4Rt0^oxyIvV&=f'XIj*deSzf[a]8E-$Y.πU"?'=YG0w7CZa7P]EePM_-14]^4QTS3YpY&6M5$'y8*-)*saOE3u<#^d3<b[_'+)eπU"O3bJAG&A#S2SirOdOIa^r3fOM3I]1O%[)#e>8#Zpg)>iGlADC0Ut+9e]s18pw)UπU"0Ccf[aVlwT((DcCFFz=ZLxBt=k^,b>OZ1PbNKZ;EvJO&U2m;_,?J#en6?XxnGabπU"bT4$IjAmq,ouC\,A%&N%H.^g9t+Tatt;I9:]O711&V4tUQ*GHw,82I6K8-iJtVYπU".51==(akD0WJut8JRlLajX]Nd0a55?*%eH(gKz3H1SRVWzcDB:E-h\T-PkKhJ9mπU"fbH7*jMB.k_5qFCj:'WDS-JR0qp%1E7V[dH)TH4t6RQ#]7:-+iM&l_N&tvBi2K]πU"n[O\m[v-9BZzuK+sD4mG,8$2#N^M:f)mY,XAmQCTcSb/4F.AczA^n+:a6SG\U<AπU"K_0MNL9N%SotIcBSRH[Gd,Z0$lFj;g)4hPaxC*4;%nS&O2T,>4-T7XG8bE_qAWMπU"JNlI']Xpl\7s)?70[Y/J0Y\eAhqTA:q+r6ndo#KGnK:Gk=1hv:b5;ZC/dUM6Vs[πU"A&:tX0iAX9G\b#wyGi+JtaWOM*NsOES%4;x=]/u]=/lK7N9BU/EAQhL*abkR&GnπU"s+?6E\=#z(AlK:.[;>'?*NPRUD#L0%*qL;RL'/$gIjsp_jRd/X4[Wn\P*F5$6UnπU"tiVQ4*]OJhr%(_/9FEG;cz/FMm2EmT>6Tl+jy1YlB1X]QQyMgSs,5ctAg((M'$5πU"v.&fuC$OfGfqNx/-O=j1NR^Y;5i3p8GW7AO<A<9E>GX=k;8dnELd2uZ'jc,&b_^πU"<St\.9h6W/#:IQFgaVOnOCP;PFsRFt:bVA'p5,-gt;0T>%HsH,f.UA^Te[G<('JπU"cc[kXep7PG(%3l_YaAgi)qL4oxf58_O_[K[i%%/[-o]CY?7g&&:I%9BUrJ=kE+rπU"sO92.i_&zI,\/5No3ZSJ)fD[bRY%9DPCTqY*Ur=p3UwGwk5ia[4:6(-GXAO=7plπU"dpWvxKXb#byp:x:5z'FNPeW(I)kH^EL=V=s>$>,S\zhR'9fo26:KfS*)qj%:;=BπU"jyS:az^#EGl_%k%b)G)G8&t6E0nZiPY;6?hCZ]^V?Rv9KKA;bLlKIrbq/Nuc(BCπU"Q+q]mVp(h,#65Jyf:%)[)$O+$?)g*8\-^fUpsh^%eTTPYzh#RxqPbw3+_Alkl1YπU"j&yC-,lIn0l3:D5M6GZ0j*xC6zG.',MT+q*,A<m6:j5IyyIOe&Du3==-gQf(3&TπU"U9>sObEGt])uzLYYfmPx^yJYi)Cng5QKd)+B(^7o3Lus[V07npiQuKc\0ydUQWvπU"yn2d]&,q6ZQ2E?3G8?XcE;B)E[j6J.&y4mpa5H$pnfBEyL'KPeg[Y>>6#6E92;nπU"xy.23SK5MQl^<P-LJq#22<kMnqoq54^)'djZsrh9TT\FFiBD8?cX[%*'8>h0cV1πU"#=_?=4CZ0^u.XY[npx14?VmU8AMRGuCMc]c%imle*[*QrBZiZN>CJTCs&juuRJmπU"t\)8j$*GOU_0q5(Dc#WU:P%V^iStla'^mpxx_D*/x]BS\TN2E:gjH(Pzo7r.O?HπU"E1C4oN^k;kHoieq/c:#z6BI^[tSdb#Gg7WHj3,z)J8igHn=GnJV0KN_sK_)B/_KπU"PX0X]oKFH:g.AL?t.\p]C1bN(dcSt98opNI(qk/uvGTJ:&I\gbLqpQgsKPNq'.JπU"h-17\;_n#];hb+GW4/LHQr'Z,$[YbgBT6h[*9D9XH^:iY#0>Kgf+.67F7D_7yzUπU"66e[31jl1Jxp,bhUkrV;m12JUff0?4p^,:LRmP+R<UrvMjL3x2UCC2f8-Wuad66πU"owHX/\1.ZuMqY,0n6*q^&_vS5VhzNelJot=%>CFx\,nJ<wT%1\N)>FNNLhS<k&8πU"g6ov.&*m&;<3&EtBWwVIYUUOs'S9*C(N*QB&I>P3QeW+.G:vm\7iP;dPvRcvaa]πU"V0rh86.u7AB.CIj]84j6p0*1+3Yr/qQBfF\z4_5540&asf9Y6HV&#l8?k5;NhI9πU"7VhC=0)bE:<<YgnSkPaFm=\gu%%Mf(yY#bs>oZeN>4N)^,Jxd/$Y]5AcYq)s;D5πU"<<vsfNTp$A:M<TxYi8eiltAlEC%Q:2#J^[Z>KGI5\PToL*ULo+(Xx4?UiX9c04+πU"#I-))KdjV)28;*R3In+a\Mzjr,VbF1X]qnkiwQK:<&9Wp&nNn\Yn1je1Z;TDa.vπU"$Ii\%crH.BnIW5K#m/f:*?ufIoImV$l*cy/LYCM:riSh&uUarP0\ROyU<DS/DI7πU"MXKTzsvmMU?.<q$?t%(fR+g5#:590_UgZ$2MxbB7rQ]&b,boEm>XU/,s[=IW_[9πU"HmkcpV[7lUO0^]\:YIBU2(OTlH+xL1SeZ5nzK_Yr43T=UfsWp_Z<5t/B(/*1#:QπU"?lGAc2.OF0rj=DqQG=$n6=US40gE>SGEZN7l:n<.2F_P1L*M:+0>Efs$7+,$K#dπU"DtIhKDT/Z;,B'L,hk;+[OnF?63[sZ*0>3dV>xMZMBjk:IMn[MMl1ZO&INLfKxlcπU"'u#up%()9%%'%-%(oiiFC/K)s%,'%%%e+%%%.%%%%kxjj%pSzsjyFcH,=Se5c?hπU"m5*<Fm-S=&R_.E*x,s(d?&:VexyQcJTtN/9HrT>YCBFv.wc.x#xLg3dAcYb]Q,,πU"2#w0#zPvx0XCgBD5MXmHnsM-=e&PElmv=(1c0^A8EjrucpE6W0p_,n(7g4zr9'pπU"QUGzo.nF<q5hru/&nPTt40sMPHqEHF\]0v+f-u5Tb8:vMLqRKXOQM/yX/y*<2H<πU"--;ALgis9Z6kw$uE'To#rN]tjdC76Xus$^6HxKoooI?CQT\ZA%n7VA80TG/6t3fπU"Ettwt5*uxC88,Js8iD>pt?/C[/cgiYkpZaGC6v>R#81RBPSjCqtjo8hWfMl<nB-πU"V_c-XC;uXjc.pHiG\jj6EK8H]U7#]aA=^nk81-GMH(f1Y*j#9F;#pg#B=eHwM+<πU"=;>^#rXI;(;5Vp\47AV9NLW%(<0_tua*5c[xt)$92vgikMRCXDFjUS<T5#RVCpAπU"KPfqP:>Zu/+'Le;v(s#:SL6uoksXw8HTF-e$/>s<Q7aoXZSi=7Mht*^\(u/rl>1πU"863iniK2Y+k5xFN&kCTSz.wNmCd%J$yII[opRf-L;;Q:0uf8'P2AD2\wzn00=,XπU"\^x:a0o=iMEe.5J'tj<,:uErq:1IdIeelEuoVQCZO.s66-67%bdR_eJ+i9rhpcVπU"-C<5If,%up()%9%'%R-%>%#fF0m&'0l(%%%i6%%%1%%%%lj%yuqf%sjSz7syVz;πU"0:Sea=wSqaDWfR#Qppq5=-eVqq5[)LO\Ec6*:8SmrEFBY,%nF_D;us88PexRd1sπU"8E8sDFkf=)dN>ul*-P6grreJHtZUlWJNHY:RGiF%^hn6Xj.*7qrLkgeDi,-P<3;πU"I-E_#gtL2Sy=7U$g7N8f<qOYxB*]a&7J,'sQ%Pe3Uugf78O/c2rwuPAEZEn[wq7πEND SUBπSUB V2πU"Mux:yW?z?7l#iuWLUox>R#a,5bCS26P8%FjIB]haie\vHa<$\[2[6mqKI7RrCzXπU"45KX>Im_ZK*WlKnSEp=<'K#YsF<)+pRJ_s7B#84eBU_?L1[(6J=V;;Pd,X)SVAMπU"r-P9;:*(\Txa0ZolD$DGWL5<S08gUYfF%/WXAf;u_Rs^'kcA3:Sfp6>?fgsE44?πU"th?cOi\u3a='x7#'4,<=r4,Ov=KtvR$(4WwYtUWI/[V:-IWOFm<K,)IBaTg3k$#πU"K:k:5\,^M)0rw,yI#,Jg&p?%eM+39a5H'#0*MS633()>VP[n__W=jB]C+Y&$*^zπU"d&rP5CG_/zZx3C5'01ZA2SjQAAgkr7JteH>_&>qoK3/\%4j5UHbcFiPEkbm^$:_πU"^[NT1a(0Q'U3OVQ+ZEb\Q,WG+RAe8O50MuI#]T^OhJ,R$#DJ5nHS/FO9dM>l0ekπU"ynh^+,]U_dQlY^HGhN+[CCd5n.G/FJ?E?yb5Bq=YHcayAyKXm)s)qfClZ\F6=N[πU"IFx_zbGro*P,1r+&0I[daQxf,:_v9g'i)p+FN:ykk&Ov0:f\k^rEwTA+#(V(AI.πU"atG=pLAU\gyfWo[yPh<#x0CDT:)uSr$D,X[Ap0FkjecD2rI:oQ7x?Y06a-h$CdlπU"%yJ0NV5P1f?1Gp:A<e+_DAMKx)8uWs].7u,1>r(*N,*M;&UH_)#[J,O&5BHE>ZEπU"a\JLlg]6dh.$UHx56aiVE9Ww2-nuoix,)ng2pA2d0<pH\v9\1,pdma]6lk''[Q$πU"VkL(\yHg24u2?1+w1sVrJD=bT#n0Mfwf;#Q;vgO<m+c2JG*i+^VxvFSsW#j-e'dπU"t4>-^6r9.p)rBu^sUIIQR+\d?&?f>K-sa1Xw%'up(%)9%'%%-%_&(fFEXM7gI%(πU"%%W%/%%0%%%%w&&gqt%hpSzRsyF%;,^Sk^9Ll[+dUknL%X;;([)ZP'.P(hsgDSAπU"U[(.>1[[fv)[6ZCPQq,*K.wcvd[wnoepwmsXpkQJ'#=h<KsF<t2-sdbWUJGlnBdπU"Q#IG&z-=(-XdjC.nYVW\^Y,z'81tJigm&shm-olh^IeF'haucvP<[)dDYOi%*OhπU".]6nmH&o]iF)Xdo2+t^]DX_2OjK_lkjp6/ZnE+$2DRE0PRZWP$d+Wm?m(3HH(pRπU"kaqU5Wn&n?ducrLVGneHIT7TJ]U?qn4j+:C7#qx64G<qklXAjUoiV2yea(uxT/qπU"bWB7i0$GI,Jf)S3Aa$nvaCr.1iuJn[LVJf),LhoK>3xhL=ng5M4J-rt/Iw9+-x3πU"i(-JE$,hmcu.?B$,VtEA;KM14$:\Lw9Q0Q^0qaibB8wgBAgj_Q+iB*i%>ioj_:gπU".>Jv_,RPeHZ>%E6NL[)=$7eB>k<KdMjtou.F6d<YA\1%BB-55kkU$mjU9D2&c8.πU"h,)K?7-gW-21UtPE'Pv,K:X2pWx+Id79u2=D.OaU\#RA(6Bj&LVl$F$E0FXcjv-πU"3S8D(GF&'<Qd*cBs$>Dr?p=5QoJ1O2reO&+r3<_<Y%OxP*$j(]jS,9]J*_JEU0xπU"YT:rV4>LnC4o%;RNIhuH2[)VYAMDXKk0?2r3['Be^<y2AtsOQhS[1-2M93YH-YOπU"F%Nw=Z]&xJBx2K=.TAISFIwzkZCbTZ>5p4\WGwet5E9-:bLJSGs\NW5S<PRQY$PπU"<RY1xM:'n?1,:$Tw?TDA75KNo9_BcP9[D3&g:D$,<L)^TI^8x/>TCH/f.PPVUvQπU"lLP4HfogrfiM)[>ofkuKd7\P<X]Qv9+<O&sW_obn5lAAbR[$f;l0UtQ$W7eUVvfπU"l4vS^^(U'Yz54]Z[<5#uV$FEV;W&<]QLTs)R%\=)Q]Us;=TDIZyt[xK=h2t^?i\πU"FfE.b-Oz=D:I2bhht?sFCO*/Fxn0.2gNfJmM*b3qi%0:AcJkDm<tg#_r6K#2n?,πU"?<LQOoESd+><N(15WVymI%pzfjOTWDe7gzGaeY2d\-<??:q9,Bg/,&-m)[tc1CxπU"(:T)pcI*m^sc5fDCkYjgEU.iOWqshl8h>efLHG$^Mw/g/)w>5x]\EJcdq.fG[W;πU"\If4%up()%9%'%7-%dw%fFY*=WJB&%%%V+%%%1%.%%%l%ftst%kkSzRsyFb:r:TπU"e:5Uh+ExV^SL[U'dA;7m=*s'*:Rj7s?obv/O2dw':k8VaXi^_OjmN.m]dhFvw8aπU"A4Hf#;<^euRumWVR-rcR$Bf0GC3x,_4B5<sI8xF\)h-NjXeiC?'_K%Ao(IF.EzbπU")/wfVZ^FuBQ4:<Z;v/F&NgE&Dn\e6qh?(5hmw3Cb]bVk_B;YI67]dbPMA.%S0d8πU"<3Du48?'M0GWjl$yd*1uNjIs-ZulAj4l?w)sffpGB*kpRe_tzwTF?(o6v^]aaF(πU"kivU7-KbQ6H,gBH:dw9cV;Rf(LvkpNq,<8&Jv0R+q,/K%jgfappiL1Jq.3[F<YjπU"ik<b/1p<y^uGrSC%q.%tIr+uvkj5w[PHfMaRZa/cbGDBfs0Nr&wb-?8c\Yr_eLbπU"n5iGDS&4[n[jgOpb#NXhYY#JN(#-3]J=eKGEkdC1Gopbi=QHR=*PH\T<3,3/IbwπU"j+qfdNEaY8G%:]^iRJi9>G?dTOnE2[E,Qh-py+sXp\qT:tbug5g4J/4$39dVhdDπU"bq0]AcH)G$O(,(W)+p=_^Z7.+=/%#QLI07DHFY5C1c%]+[p8ZxVWEH'NN,4n2u%πU"p()9%%'%-1%)oi4F<:M*J>%%(%M%%%%0%%%%knq(j.ni#Sin)+JCf/';U5kEZLEπU"FKqtowKdSyo]1P+UJV]tR1VRhn^p>TMP>t-WFXfDspKdi50n-x7d:A]qm[sh58IπU"<D0U9dlY2T<Qr?%I?+L>pngW,FT[3*d3QUjFWD+#YO:\RQyH5L1.UhnONc-5t&uπU"%p()9%%'%-.%Eoi:F>IF-qO*%%%%1%%%/%%%%wjf%irjS[uqx&)%:t#Rl<w=NBNπU"on#s7ZO,1(&<eckyWHP=KD7([+.#M:7iTVbdlXW4,ikh.#>,^h^X):1'wFP.HH_πU">BSHPHG4KRO:;hc-gh4#*%Dvf$<RRC1qTb:pIV&h0['<M=YJXdSOROgo,IJlLr7πU"mPhg^q\%9-;bQD6uM-%fXLH#W:d,P<g(Q3k<pUkG6eTtrDYZ,:3Nm70U4Gf,#KbπU"5CXE)cN9Mwco6,%e^2_q;E>hDepj;E5PLP6L^nBZJ$xA?'w8gU#9v<UYLb%4NH?πU"65&zttR<LjKRMim6u_<V45dC*+[PzJfD*3So)=Q=^Ee9oPa7=cqvbbbBbH5&5j+πU"$J/fVY')ubCn$-*tb^Cmt6ggYToC3Swm7m6dJF'WL'92lttiRJu4ZFdLo1[q(rNπU"_2t&$^%9QGrm_<U5['l4Qj8q6HU;lcT=(8cuD:%ZI3Et(**p,s_TY*JcYSTS+7WπU"[#uxg4XnR5w&2J8=9cgAWls(O->*8Cs5Wda7,$a9Nce3qBUNv?q'(?0P#fdHlpHπU"'.^=/2IPdYLRr]qHQtTJFPNf4z7dMRp_;i':dsMeOdC7^pfLW98$CXl:dD?G6BgπU"e;xfiHSc',EG>Vaa$l??h/,,=#/x5X*Je]Hnh%ObVE:4#4hB*kuFkW*8>4X&I0HπU"ykS'1n/7H[&iUz0S=I^sUq%-.tQAW&/2)pDONDIv<S#.._LSv$;)3PkwK)Y8nm1πU"a5f01,37WK6)$u#1.\3=+=K+^FmC4^ahKs6#6EP<N7DB.,+Ld:*#<R4rSh+&$6<πU"2Zn,d'Qb]]7&/A$p:IoGxM#V'P(XQ[.rwYuek'S;1=2SRA6jg<96?Pj+mf,ghZhπU"<u960wwN_ZhQ*I(^4HMXuXBK'$_A[h^rr</+'[eq:EHNP?Pt)bD&,WvMY-&cU?4πU"[l9pb2[uk).3t9hLS5RBWYh*:G?H\4c4>HZQYawBc584j*S0XrVh]&#?=LF<:K3πU";WjT=w$Z%VSiNYjeQpUfa?FZJ&Can]hZII;A$L$'Xa..)JL[PS*CLtt\nHd=HJ$πU"([s1r73_NVWlM&-2KP#)A>(Z#ACn?.k^n.60,W.:.sKwKGO$;ZC_Kfka-Mwh9./πU"3D1v6[$6jBS[3n8IqNNuGQ4_79SZFU;^SemEl5nM,e(==wl<_3+KX_IJNib^aKaπU"p+V1(=O-,/w9_5smd9=4to8M9*jv5s$wFs;h2]CAF6r2wjaLN)UH*7=vQK0]V&PπU"%*n7iMFy0dn:o\OYO/mXFC#u115yCjf1'k_Ha^YV/%g0Jr$.tb8SB)*P6RCgk^GπU"uj\_u.^\V8>Y)iH*Lrd/BBFG-XP;Xtd;6;W<s%e9n3/YpWAOQIfWfDZ$(3LctN3πU"$q+M8N[cQqRg+ArW;$^l[iT4>c?Ng$:=n:-N^CI4k%cLS7u'&k1VpaqB,Z0do0rπU"qEjWEUN,)<&Fng47(/Ir6D$+qsMuUgr?Yu-A^v/wjKqrSrnw/wtNj0Bs1b*++V$πU"qQqAg=sq=gS]*'J&Q1GA,M$hGa;G]nSxCspmUq(S<<1Glf<7%7nYy;y5/:Gb.<CπU"V=8*KB1YTjXL7WaoM(hXX%m;TXcgJT=clLS5zIV,a=c7_(n-PJ=jbNCBa$P_oW2πU"T39b&UaVG#Y<)NTtkd9iN8]H_QOQdVaziTj,xUgi6V0T,^P6UbFFXO*IDI,3]]HπU"4#dbu_fX(f?#1[Wx[uR_Bj:WZ6dhF=43#l1dD^4Hpp#uH(I]hL5xBlK2:v1B'zBπU"uCeO/_?7hxdKPO)gRKfV>jPQNlB_21vrPb,bn/-mk$aGp+TtY0b-Sv.$1Jk7ja4πU"U$Xovdq7I9+o3h;S(lGO^H5qlYn_Z9n;^R-KVbugNZwrxqX#C<?_jtm<Pb/f>k3πU"r'u,jT^-_K*2k3,V...*sd5)w%'up&%'9%9%%'%-4%/ii1F9p=(0Z)%%%w1%%%0πU"%%%%%%%%%&%E%%%%%%%%%h%truf%wwSi%rtup%&'9%%9%'%I-%0e.iF,l)Zdb(7πU"%%c.%%%1%%%%%%%%%&%%E%%%'-)%%%ljyu%qfsj%Sirt%up&'%9%9%%'%-%)(jiπU"FO4UYe%B/%%'bA%%%1%%%%%%%%%&%E%%%%#-.%%%l%fWkn%qjSi%rtup%&'9%%9πU"%'%#-%Ef%iFS%?Ctu'7%%f,%%%1%%%%%%%%%&%%E%%%&17%%&%lft%stkk%SirtπU"%up&'%9%9%%'%-%*KdiFGi+oz%4'%%%q'%%%1%%%%%%%%%%%E%.%%W:.%%%l%fWπU"kn%qjSt%goup%&'9%%9%'%7-%\wIfFWI4qwS1.%%XY%%%0%%%%%%%%%&%%E%%%'πU":<%%%htru%fwwS%zsyu%p&'9%%9%'%%-%o&iiF//K)s,%'%%e%+%%.%%%%%%%%%πU"&%%E%%(%=I%%%kxj%jpSz%syup%&'9%%9%'%R-%>%#fF0m&'0l(%%%i6%%%1%%%πU"%%%%%%&%%E%%%&kK%%%ljyu%qfsj%Szsy%up&'%9%9%%'%-%(_(fFmEM7g&I(%%πU"%W/%%%0%%%%%%%%%&%E%%%%2O#%%w&%gqth%pSzs%yup&%'9%9%%'%-+%dwf%FYπU"*W-JB&%%%V+%%%1%%%%%%%%%&%E[%%%)#R%%%%lfts%tkkS%zsyu%p&'9%%9%'#πU"%-%)\oiF<S:MJ>#%%%M%%%%0%%%%%%%%%&%%E%%(%rT%%%knq(j.ni#Sin)%up&πU"'%9%9%%'%-%(EoiFb>IFq'O*%%%%1%%%/%%%%%%%%%&%E%%%%$U%%%wj%firj%SπU"uqx%up*+%%%%%%1%1%'('%%%^[%%%%%πEND SUBπV2πCLOSE:IF S=213AND B&=Z&THEN?" :) Ok!"ELSE?" :( Bad!πSUB U(A$):FOR A=1TO LEN(A$):C=ASC(MID$(A$,A))-37:IF C<0THEN C=91+C*32πIF K<4THEN K=C+243ELSE?#1,CHR$(C+(K MOD 3)*86);:K=K\3:B&=B&+1πS=(S+C)AND 255:NEXT:LOCATE,1:?STRING$(B&*50\Z&,219);:END SUBπErika Schulze                  FERN FRACTAL                   100775.2275@CompuServa.Com     09-30-96 (19:42)       PB                     241  15824    FERN.BAS    ' Load/Run under PowerBASIC to extract FERN.ZIPπDEFINT A-Z:SHARED K,S,B&,Z&:V1 'Created by PostIt! 7.2πSUB V1:OPEN "O",1,"FERN.ZIP",4^6:Z&=11568:?STRING$(50,177);πU"%up()%9%%%%-%P1mfF2s%5pM+.%%\G%%%-%%%%hf%qhSfRxr^(:r>T]a56<aXDQπU"L+DYD7t)dlYV_;weSZVg__i/7j6%9^u7.z0tmmRn>kcwsJn%6p9JkN=,-M',3g>πU"i#Z1,6W1.H?la0%FK%G^fSYwAnL]0nK*>i]LLB*H,b*'tmrMN#HV:a26P[>g:oOπU"RL7V%_iD-_D(C_Sq,irI3F%W7UB]#iQ(?uA5%5V3DJcYNL?nbsr+d9ZRK=,5WbXπU">;n*a>AR=d=2[HPLLM$C*DZ?8,[bqD\.sCPX*s/g(6p6Tkm,KC*I/;MK1lYp66LπU"up_ln$tFB4lfu7-KHmKjZ&xK?I>fI8_AP&$+N#gMItgAktnI\NIn_SEarLq'uZ7πU"qbHB>BOI,NGmBp/kGHmf-c8*HnciSsjj\fk#4/F/<*YJ%MUYE'J7htj.bj;gzTUπU"yr^?+=VK8_\ey38po0ef8\p6<H3L2R2LgrZT&9q'*hM(P$rk4gWu'eV[EI'[UHEπU"^-%q>Fe=0F*$I>df8]JeCBCVl'kUNQDkFck0;aO=n9C][P]1lI<)O36[UgqY*.<πU"KqVe\JCl,uw$kaIw,<9T40;[f7;h5?BG-Yx]nMrdMSp$ETA2[lXT0\oL>bAqtKJπU"8oL#[tK4ogjCqzV=i?6O)(facBXhJI/KUtuL=uIf3b>k'TWYgX)>jr0ME&B#J6-πU"m'DEEI3'S6bb;&qaCRhQn]?gTFp=9Dwu+g2xgEnN7eSnqg9<dSr1K^X^2Mh#)U=πU"y8-mCB*Mv:QT7UY&9>J3[EB,MupagnnCgr5ME.:sa)pl8nWx-gdz(xfRK9fQ$<8πU"PSEU_Fap_Dr<.=ZH&C#t36Bu4zba9-No3*TcQo80M7X'7<QlPq0]UT?]6G1(;iEπU"RK_&XjAn(-'kJN/ws3,TWT=K^sjRhEq,%3LtTo4CYL8/MLYx'[XT>\O42q&lO7JπU";<4mZ_I;M8jxBo=86Cf/T=:p:*Lz*?c?-W,Ce4xw^jQk09vEkGAI[U$$+aw?Y'1πU".=)GgMY^Lyi%R8zm.B'MY&pYykprJo%2.4TEVMD4TaFJsNH^MWC:W_20j(4M'[rπU"xCt31]gOl[d;[Pf9J$Xf#F5Ye6vSr<l<J1L[v[1EQ.\R)di?fns9>ZCS7dAUd91πU"BCP%?Y(/c$ShA,FJ'x.;3W+s%kTjO_k=kcJ^=fEMDPv(C(<H4D>C(IQkljD%=gTπU"5-9s-,AMRXH[o-OBIGFXh8eITc1P:J?uZI;7Bob([4FXB_G(/O<:ASl/8A8cSm>πU"k09w]A[5*S0;u&$e,IeBO?B5yGu*HFE57RAr%mPW9h9r)<<)t)[.ppMnnENK%$=πU"#R<)tWf9gqnCG8NDSu*-8u^-Wb]N_&h3&vV2]dsUdOQ6B#)q5;B=0+Nzh;(npg'πU"=W3NIf9*kuJ)o1XZ.kl&3A<naP=6CqWt4er.?#3=bV\+&j3v:c#+#[7d.JaVk#<πU"PAXk>+p%Q-9V]8ZE?=Z(d-'YFkEn,)[^LN?m+XQ[;cB^%FFyV[]g]*=c5o/<#\BπU"=Nn3+S=0n7F:KO>^xpOWTixUd-V;GobDks)F&OmGfL&cnnof3qVGS%\yjVY5PXcπU"Ji[tY8z=,4;>M&BQ1GbT784STI[mztum58Pkx,0dE_xMxJ\Pu]5;R-ekr[.D*']πU"lRNjrPtB]s00Hgp[daZXYSCKLc(8l:?yM\(ii=*($^ZdGl1lSXcq._nj7LQYCMhπU"^x3dk_*/IZ)OOD-VD[$[g3\hnN(DM,Dn75VvD#(MW,m]FO:&B3c)xJ]r:xEe$QhπU"F5^tY,T*E.Ku,nL0X(c8PErWX<6Fp)rh#ruqRfp%XHt+v1M$hFrib0r'Zv.N1f_πU"RH%re*iEm)kC?L'+6;&#wTo+niMQ+fU')'GQ-$i%CjCoVMFvV+f_8\H#bY>#nb<πU"Od8:%2-IF6gIRT&Qcc,F%faJ0O.szS2'.7n^iVsobXLo\eT8*ro3\L%;cfm.UhtπU"7RpQze8s$:^foSKdaIWcAvs0,)-k<aIT=b?HTfp;M=Gp#jf,78lNn9s(_YGs]f&πU"N&up%()9%%%%-%%P1fFtv]$(&o&%%'-&%%%-%%%%hfqh%StgoCb_t7$L/=?/nY8πU"7<\7C=L$HWfhXfPGMbvUuEX%-<(N($5Y*/JoiI(7UnDPm)ZI9a/j)&fcENRCI?AπU"51rX4[IR($gO-Kw$WR.ECcvWOLb/tf$vqu6hl5CT.hQQ15',Vm--%by/'YPa*).πU"JyNy4Lz%ey5d3q9UODd=NfmA2-sSh$Y]=(\uaFD$<'[Fwbs46YjsqK5Ef]F)%[wπU"0+5fE9NipPO2<PW)q>EMIyah^gR%4#%<243&)u(F_,fl^v<APDk=H.\%BjfDz>DπU"+IFtf((&S7<N[mt)PD9Gv,&qA6zHxfcnIq34E[GCFl>Pkz9[FjFjSR-c7&(]E$lπU"FsHglp7c>pX_bLGr5hQfbtnivK*Y$h+ssZ=r>HtfiU]'UXN:c.a.VOt=DdQm4RrπU"W^6u(E<x*-KY4J^rEnCJK^CdnMIa>=gG1tJknVs<hR952]/,Y\:XvLCRoKIexlQπU"ua^ihJjxak>R6XQ9d\8/A\dg^uri\2%]WjHK:M6y+J--d/40m]\s9f1/Slvj>NrπU"wN%up()%9%%%%-%Q1%fFt.6g*S).%%7-%%%-%%%%kj%wsSy/'yDz:rB\[416:kTπU"x&,fCr5aYrf\8K+hd]nT\q5#6Obub]K7I,Jpmdsnq]87d%J60-R&3[pnP9<nJ%mπU")OhAtqFD-_H/d:sk8JF.$)Zr]?gI?Drr^Bki'$hA2U8'l=;_kH\k#mxTX3Tf8s'πU"pX6pBDTgff]P>iuE$EC\z]iqCj4l7#3;=<9hU\-;Ko_POCi6_h0+Iam8(iH:=0lπU"I.pVh_Cx7+=idGeJj]qjD%7T$<gQ*%RjR3R.C%a4JshKxJcqt>(r3n$'E7%'[5lπU"9+i)qC91EyIpMe_ha\wm=][Z*3q+Qwxp/ZJ9t<:vvtoLV4Tkqp7\p-Mw)oV)'OtπU"Nu(>ZPX$_(w_\kBW%f20e8>P$-94.KGMhZ042Ko8-]-7F92,^HDH<F>^Z-<jl-RπU"R^-WV1*Tk1fKce1-[P*S.hW<)DioGM7/OostJqegllE??MWe33RE6x.cMU+anrYπU"QMBt\&D\*G2A^+q6Y?GMxW.A.T<jhSl$RrcA>S9pe-:*O'n9t8QgZW?7ZF-]p;0πU"T-)]irk<%jSG+i09B>PO%(vz;7xnbv:CJA6f,RP]ekp$gSskC,bbM*:\_>/[1O6πU"8h<2_SgI$k5A]1LID.j'^$'ZhkKeci9C5Y)(ljw#$$_flN)9NlxP<-&;BD'j+<rπU"ti;UKPWL9_Fh&77AlhTl(=MD320?u\YL)b/*f:LADf+<OG0>X/'xJ_,#:HY8a)TπU"OiLO7=:c3oC7_.ZO0[+aI6r9qc8Ai7,m3VZk[c9xPB9)kt4ZP\HA5.6)h)6_PC_πU"7nq<gl#7iY7H.I^cCpF%)g6PUGD,P=2tSmO1b3+PT['5Z'%)i8WrUbYM0Na[-uGπU"d%a8Le7EhGbTNsZ3wr:,U4+*uf?G3a&Ty1Pe2f_Go5I19TC<=\KG]zojX7W+#w=πU"KdL]MBIL+&<7U,fH79p2JjFYEx$A0Nx'd8mf9SUW8_\'==EbuL]SFC<?tdTunUrπU"M7bXDl;i,8#r7^Nu%.xO7G(2sMl.)CCen70fr4N;Jq_P\)J/qn[2u>eA45,S04KπU"lewaZO-/_]Y&0LoEccIJ%WcFnEO='_h%u>-sJc-Nj[RH_M5,Iim.Il[Q)OdJ4iLπU"E-v179YmK0McKu>ILf%5L+.mt\,Z:M3Q:X.0Ip=WQn&&1M/G(6.MHRR92?X3D&qπU"fen2R?[%]0UOaEBg2ugNJ[tV#D&i10FU5c=[LQH$s.dXc'A&jQKpU.,69-N_XB<πU"JorXVNnEd#5LoVzn4b6jBi:,([\hUNG?WBsXn;]5Y_GrZt[4kBodgBk]RZaw$m2πU"Ur8WLHX8HsUsJLM/II'K3UKL]auCjfW%cQQ/uNvjHlgD,1#r*C'c.2S2P5&rQYOπU"FRA>Q1okWLa/Udcs8h/T7#xMANf^nZU:GA9U2\+,9$agOpr7+;>.pPn)k;K,&S-πU"NW1]2^(K\/W>nYU<BW98E%cls<#;Z#8jCSyBS6(q7>l'x'up%()9%%%%-%%Q1fFπU"^NC2u%y+%%%t<%%%/%%%%ukjw%sVSgRfxF'8:x[m+<wQz$uVxO1Uoqjg--5pBF,πU"S0NEYPQs]G7XVisJc'2zS'ZtdpkEg_.]^s\3OLs*dkogavmubL$Kk'PEP;yd3#gπU"I8kR&x#+.aQ;=KeJ3EaXl'#2\GrH/klc%&GKat=NYqt-tkfffWNB&S)e15&Z<J1πU":8P^roeOFqf-IZ]cqm'?.EjNB5^8,DIClnb?5/)/no3&n#KP82sbRwzxJU-wJ4aπU"=T54VIJ\>nZ3$5Pj?megEsW-o$nt07*S5pi.QKuZleg,]#-D7>b9Z(\+s=]Mxm+πU"RM/\c[cI#E3$=8bue^\sQO1-[MNp#bGU892Yfs-.p'.kQTGa7(S0Y*mEPQY]&1\πU"m0qT\BMFU&7d9q=>a3^]SG^uns#Oxa\>cE:Q0tR].hH2vE'8(A,ZZE<90Qj3g1<πU"W+dxYrxFEsf_lQ?.^='4[wqtijw>8-Z;lCjT5?rm)],3*vz<Y#mwK_nC)&6<UruπU"Q_?<kgj4l;*fYV7IjgI[o.'/p7hnH73(9qUn6U2Vq&0;]^Gm);iKaXw<ggz<1HcπU"&x)13\B,acph*ZZ:X5?pSa0bj((_0\KTrkaU,#FKmr:rMjcVDzaTtE*FY^L^JoOπU"<Q#i$lUo'E2TD=+e%b8_mO&<vXb+Q4u1V]8O.wP#j2%puBJ^EbN^IXwMY(_oQYDπU"2JD3-k]srq29apRSB7sn_JJHvar5+'%w^RF4_ERhL&gn,nLO\P6z;^)4jIrK\d<πU"d67u0ErHQQINY&'LynG9N8X0Z7Y')>(O-smpgAu;ZgRN-lc.I5EEH%_EGA?S]#)πU"ca[0i;Y4fAzIzP#W(x*TD%jbLe&k]k$'mWDz2a>kO=iMh,#9--2J#-,zj0&uqR$πU"vGi$1#F/$M9jc*7L=oac^=JMvW:.GwmarVVIW;tz&_*Dymu.hHPq6b(nirGCWiqπU"E/kSmgYsk.5iCvD_Aw*#4j$bu8&UJp^3pC$Bcn#J?$Cl9hlFW0ld'0;4sSJ9NT$πU"0-Zfp4ruwB1pfPch=/B(h_A#%;qo_2mwSw$N0PELRp3dH\(-=ZLTnPlPZD0$:z5πU"dZG/\=rx9(?bZ&2uIF%?%ZO3PYWKzV6>nko&CXcOR/I$Wehs&g0&s.3trh1D0^XπU"()V4yy=P,wy]PruS=j6=Rk^=-oHk&-KSH\I'-W4N<*B0*?Jt5$c;ac>N/cGkKYeπU"+9)^;by,2[:LO.9oG/qqfT$IHgST(i1fe7VB5Uh[7Zig41u_hokaamO8,9L.LygπU"MB8?S[?hixLtr3EO%Ot=AYJb=uDK7f$\1+9)Ru-nsDFmkiurwJ\eI*)'vW5DTc8πU"-)MoZp]#AW,wJx5&PZOXex':?4,0FzBsi(Db\^pkV%KDE*Q.A.)95o&cRV:)9fCπU"jHeSNAkU8gZe-fAGBA;?Z0lRSq\ra4K%QH+ts#-V>hjCu['1PBAfrq/=w)RZb[=πU";%NTy)Yd4>bS+*m$6(eJ;'Unbpp_aD%DR\TN:Qk$]ivMJ+OKnCL8a$jR;Bx152AπU"X1Cp-TH0Myd*2;/,;*gor#85:bo[oNKo=UJ>8.COG;aYR/x6Zs$w[<T0YI>Q'-qπU"ps-&Ik#wwNbHYe1fATfZY,EuFjm's>8=7e$sIPsZ9g?+vcoFtZF<po;[;pCwcQTπU"H;F)+ED84+E7+C<bpQiEGae?,')8U,7c;Hm>-&qQj?mXqhXSw<J[o,yiul;oW_4πU"KZXu1+a;CeV>AvKMjEjM4vv%[_Y/noTpsfh8g&soXD-vJLVsj#(>sWQ>^^FWPEgπU"Q9<#,T,N-9^rb\&]/Q*&GUa_(SBdv_1hVzrr6ZsW(q,s*\V/6jQ#0k/799)kRBCπU"a>YWSc.^:jaW&MjY;B6KFPBN)Dw-9eq0xQ3U_=>4D7_SCp#%j9%nU$e>?3KX$J2πU"07krhJsYBpT66M\HIR-v'[wuq9NG^U\9DjcG0M^YUs49>Y%qFrqmAQ_ok(8MIovπU"^S..UHrg'ee'QdHciAf0tsoMeD()<>u++.Siei8j.V\A'ZPpEKV8psn=H1XUGhfπU"b0M,WK&Uh(\$xP1gv_yhHNmEAC0?S*9>,rUAM0y'qTup%()9%%%%-%%Q1fFo&mWπU"1&y*%%'h5%%%/%%%%ukjw%sWSgRfx>&;<B[[F5wA5]q4$EK^E\b^&kK2,:r%k:IπU"=9Ue/SFv9K6/m4a*4ko/(mP\&P>#e+Th/0#rd>*%dDbWS,fZFxhA=RyPnOpLxA5πU"1YWH'$D'esQA9Zr%z5W&$x5ETLfDz%3W(b^n+\FdNDrrrkI'dK[wRo9n/]g3'YqπU"cH3YP#K57C/Er0H*HCI/a#<f$v$PPRS_^cqGsW=O;aFKb33A\l8J1mOKKdT-][0πU"RemMU6LKj6X9w$PPj/Od=Cr-rxIKL%t*f)]K<snKRGJGS/g;VSE4]h[$Sd_Kn9aπU";E.YjY^TaB_)u*_taor_Rn*L>sLL+F?Trx*E1pu%.PKDSfhT;F;P?[M*40MGJ('πU"m;/iTbxf]1JOneAJ'C/K2deLWl]vTI#HlTwQpRH_nChNps'xC5C0ZGgty;SZRGKπU"piu/n0[$mjdq)mWY'9?noAyWrBv0SM_51>?6d(OXr0:V6/qfawGT=P74C^p:84aπU"iM]_&Q+$^a.aIexQ5870-5AdiYc0'p0:7Ln)-IJxk#ad#HO8dS3&i,\7,U2F6<bπU"Y#n$Rae=qn'>Ux$[Cl/qtK7^(YakOenIH18]B)APFQjaEg,Ne.w6mSC)rtg7>,'πU"'+clgOtgkG5-hO8He&.w-NhhYOgoBbxnv/mfa6Ikdc\>.3FQPp4Ddoa$ebm.T%XπU"2X1,;=T9t-H6KTUTF(b87QFY&r5)In$HG?IIDg&Lo?i+1X*6uV5h-ej]CJ'Q)v;πU"4N>Q9Ed_i&FPZVCH9MY)(fTM=orh.+OkETu0:#'/*ctYqFEj)2=A5qQU;M98>Y_πU"&:5tUB/<Z#.Gl[n#'/53fP?cS5]KEGxQJMo_i:CFEa6]<'M<pEVSRY2nFHW3Ys:πU"n9SYez:TuZCF&K$DhixUQ#f:^8NTjc#5WS,5L]XNFBc*T(u-F;vm0cJ+>awQ&0zπU".2+9,[5\OV\j^EQ\6s[Rw8&VZh[Tnb'ZEl/cW')XuH1q&h=YcS3UA3uWSM_-l<4πU"iNBt)$\W/>ZCn1=?,9'^'QzF\d8:*Ql7='EBpz\rf=LiMqpPM';n8m-XT2R>7\DπU"O&ww%uW)eNA\LTV-H_b=:)0Q]\$oo60;)m(bn>j*RR(tQT'L:UkT2Q/*\a#W4ZWπU"_y8M4?x(-]$RP?#?PfW5[sKC#HyO+ut4UJ7Lc,Cte#-:jnFFRoI>=tkpI]/LRp2πU"sdeA6kRdOVpAO?Au8Z3^yNfaQu'%5*Oc5,k)fqL'DPBOnFB^W0KkcAU+\n2e_W4πU"od+_'u%y^rw%OwMzOKU'y;.*V+o*;3oJWqDp,0s(&q:pAVEq-'dIHz0c_oQ);L]πU"-ppnNoAM*bfPO_MX.CTv];U38/yG+&Q(.Qw.RtTq)U**[whhu_^$gl^*].&vs0LπU"\3]H^3VvzkS*xe/if&0kZ#U#ij$e=Z#gR]L8xFG[65laAQ-jC1);[*c0/+b4>D6πU"TWH?L=.)2e$1ce.>V/V^*<#R2ed5HT##Zdiq;oDtoYBt2'/b&j68NZvp]%X:IT2πU"xaR183[)V8cYjJ(oN'Gpy(SRt?n+Ga[WH^44%cLZCEGeZh[pLd6S6b9X2LB9-lAπU"I44UJ?\/Hi]n)slYXT[5(Z&UTLop;'^n;]/37S&LU.2NxtEKiz9HH'IVjsffmPfπU"S[HOVpbiK[PlbE,&PG2^>\_o\c=DEu*]M75Ys&7B(.]FqP]GW#wxCo1FR)jy$FiπU"DleGjLpbv^#llmg=e?LeF<6Q0.'C8G)>[J.<lPkRsa*fri0(;7]Cwn\Z=b\NfM0πU"8?h(yG7K<ash[LQvC(eaRiSkn'NumN6H5AI*Pe,?urTvRwre;$F]cD4s&hueWLcπU"PBI*ukq,<;\9^T%up()%9%%%%-%Q1IfFL^?v%(,%%%_D%%%/%%%%vk%jwsV%SgfπU"x3N(<x]\]7wVKxCN'anBIL&V\2tgZ^+7z&Eq/9XPo?;EWl3>eX0r#EBC?Ye(du.πU"]PYX%D]yS52QeQUvCzQ4N9X5:l9Y_ggU6$8SN^)F=qbV7TsmC+04>W?-4-%PwrMπU"<*,x&t)*q5ZWusl31+MRZmXU^r(5<T^V+6Hh)HSL74M[(PY9jPW025leK5;FHwgπU"SP85xDH/['.u618mZ#H2-2\3B&jG<qfgFp_C\lYnz8P:VSXhU.P-qCgV;G#4g37πU"XvN.^=?ku+m5Q.JF(.7Qg&7sFE_NSV9)^uV,=KA]LN\<N5hKFUb>(tenyy0sIO;πU"n1N'PrMd(dyH;Od+nj+nSZ8=Nk0(AVW#.*Q'b#:w(/0Pq4PJIV>tRBMufUwq3/<πU"Jy>,#;]5ET5YY^Og(#Ungh5)bk>:r$q8tJQPj%17Y7nBgS*qo4Ij7k/dDjeyA:eπU"(S&p^(efxK,hdZ48DU/0&:Olnf/qyxeO[yPqm_r1:o+;AD([w.-Q08U-Tn.<1mPπU"bUapJ'[45=**KlJ0M9]vZ83CSuQ5_[-:sKa]Uf)'>.:9KcN)(4h35G44(UT/aRdπU"J.rl5IfIUI#e&b7dlsljrQ&7)E\I]4[[)te'_Qs=iInsj25N=bjjndU>,&2m=lQπU"O90emwnxlsR[Lr%nX9452Yfw*zEb6T1m=>?bEjhy&FGZhD%.bc>mlbJs)s&hA&rπU":UQ7xPEtdZVGK4b#7/;Mo2m$%Dn0*T,IInvy,i+$]IYKKmkKR[1F#kaH#9Wi84iπU"<fY$*>\G>p$$Ful+kGduIXTdN3%DlWg](7sg.Ab>JHd#l>aMD:%nI6tgHmsncGtπU"xCVNjIWqA/m:e\]4YW(el+F;JQyVD\;'*f'XQ*3O0$+chdU.7S+P7'Pi^%0at%%πU"IxbfMoXyw=f)[.(g5/Y>u'?xpYuLNNN/C#,,orDo,$]SRSnmWig9==9&AMXucc*πU"6buR>3Zr-a5dP;<Z'^0p10V0Qup1J^lX1J*A=iD,p/Y2%aua17>Waas+9q$^V%YπU"Wtai=7WH8W,J86kA3n$=n8%^=SCjn8y/T7k5cw,c)c4Ya.Kug3(H5rK%HepIBUTπU"r%2FlWH[kscpYaHdE9BH/QU1n=(f5GBq_=]n0LPG1PQX^,lVsqH.Qz42&j?'k0YπU"1eR%4kd:[jbW^8d<DPz:7cWO<&CHRNE,=hT;4E=eut-n5ziP$D9y:Cuo\Vz&GYOπU"v6EB%$&<<I6z8o'7**gU-Tdf#yE-)_OX^1j+KA*fKq)lawDO.KewZe/)sx:tyOQπU"unBKM:NZ,\uXT348hHcwcdkRdnQSm91Vi2IJWT'7LCC/JKm(xl,g=A%mY;%5c>RπU"a?.G]snVd2Sv0krthR6Cucwap8apJKO4z9sqGzDxMOzM-ZT%N-t&dbF>W%+u>EeπU"Jp%)z];%p'6Riz^iRYbA&ein9EevvoGy(7L#K'U0;q(w7rMbjn&:ZB*U'[qE?)EπU"K[/A4>)W9Ns'lZ/0o9>Q$%)pmlRn-6*AO0iWiE[z^i/iJwhcjaN=>k-p7.Nc[rmπU"3H^AN4]4f==ii+iX1.m24Jw;88b/ZeWZgDbf.KUlqQejB6Sx)1Ntlw^_Yw_5YU;πU"]DEnc4J*0OsJ3A]6+R%[$+'25MO*O1PhY[HFGW5gBT%vT(h;v*F/%gvnmn?+fVtπU"IR[.andg)sc+5J?'9j3x8;RkWxo?_$^&\5Bfv8GL8=x+BYT,GaS?+Pi_,aXjLv<πU"j:Tbq2es$QpVCd.uh<dR#<]:>krTz:]E)h<Y.J7ja-\e\Gy)<hU.PI>S+%8ON?cπU")Pe>l\+]eie625=l/DTTy<d;E3:R(HDIu&RRVNnN'jS#q4(;nF7[I\4EF4.-yxPπU"$p,WR[HJ2S-g^gG$mc\7hQ%VH9AfK.]d'DXw9vwk7QqZ_;o2vk?>B1(uVc5cBiCπU"V=[3;COs\]k&o$eXF)SADmPzFhRj$?39*XVs_?<jV/Y+MX6SfY<KVu?1;eoW]S5πU"i4^J7yW_S#%J9Jm9F>F^vOr*fCSa/n/GcPW#RGL_WVRJG[w%M^[q^h0HOJDCWf?πU"GO78>#LOTu\_Wjf=Y^f].29^y5Ngym#(-Ad;ZIP,i[zr3>rPI[fKe[D&Hw^;k]^πU"'=_brdcSxRcjaK#?Js'#:+6ihPz:r]FV,1Ox]$hhAw#TY^ycHU&kIbj+#QqPK%fπU"b(3tf'S%UusRR_'ge.nkzfC,u._mXR:']e1rfn:HniKpTfh\oepO;lcHZ1^dKJlπU"U'R04N>U4Tdpq7&jZuKV:5:i<Un9Zo8.Yi*';tTY8AB^RWiCE;2s6W7Z-:]Eq<sπU"^A0KRd3EAl<)?[)i:O1eG0l$t1sQ/)C/uAxoCE%uCE?Smf8:YsHCRIi\DSErbp?πU">T:w3KSTm4?/xx4iY=9Gukw/u6iHiqXTeUMA=WF?d)Pn40cu5:%v+07SPQPwj2=πU".<OH&)=7PKL]NYZFy8(6)djVa.585Q19Z\ltflZASZoq4l8eA&9ALsBK,X-KVU-πU"ax%u%p()9%%%%-%%Q1fIF07%*I\/%(%'L%%%/%%%%vkj%wsWS[gfxFk)d>TR]7xπU"K+&kd5<:t/8SuPRH4]bH&ILv)2WlQ\E9pue,2)q1FB+ImCOHh.N[AcIJneBp[W>πU"l3:eX96_Q#Z?5XYE.B,DTD_?abdJ;IqeVNA8Wi5X6^viKUnGMM:FvC_9mXR<iHwπU"thlPlZ>08bqOX05u8JTWl>2HM%2no6njumn>IMAU^G8o_I>G$V)M_YEi\_5aWfzπU"0<D;+,R.$ii[d?bo\V%\AU>Qc#N/1NXW'wUJQ/WH]abkJq+^=:;+$birHn;w,bPπU"jFs;,ypf=Tg\fb_)Gx[1sQWG4\owyVzSCDTvHi7?54l48MZ?XNXvx/kTKG?qfigπU"gdePrHitwV7$nVtGE$u943.swk9?mC5Qj5c5e(2#eWtYq#.YQXZ\?TJt6FGHB<gπU"D9:K]igCCk(Nb(XKZ&[06?hpG/B:Ao[6:892QJSp$T>c/dQZ5<9Q_Pc/$sT*p6(πU"QCXX=48.aHe#TO'JANoZds8JBa(IXw0;gzT#(A0u)k6UJ]r,sOQ/YylA?Cq6RxVπU"DO]Jy5hEgS%q3,)'hBg0f%Lm\mthq-PqK1sk-.f\tYB[ocY.xTW-N\k1.R60Jk9πU">F[t4Z=fIk\+_k)TpNlbi?gU>j;q]<ZYU]Akr^l]50wJd58-&0R][x)'RNnW+ZVπU"lQdww^RQQwL]-tVP<(G-_]Cs;UGW&m]-qa8cu'Vf9ThNuCWG?42$Zrs$=H-f:jQπU"S)c=ltu1/Bk<ngSMpDXc.)LE7elv-YJbc(<?*LH1BS]u\%l*NF*6EgbZ2I^'G&&πU"_T#<l9B8d'9%Nw&]cG^/2W4(8^Zsp*+0hv^hS5g]NcDvRqL.6GT\9g-kO6OXXdJπU"eQRdAvY]]+7g#3nlvf^D2D1\hb.K/tOiIqSI9NbssE%.inG.FKp=U#-mm4Mt4meπU"T$qHOf?7YPqRC+TCGQtcQcy_uc^1\oK.s]o^<6$ecIb9*F_#lUQ\<_IXuJ-)#o/πU"O1EW6q&#My&ZC-^K>yCmRn*s?_WP4HX1Egq73fc3T3)+\*K4:b)^?,d0i0_l<gWπU"FzDue_5Fk&rbDSvC?#E;vbZY':JFgp]=a=>9sX#;D*$GjKN\1=.>rlL:3%/%Mt.πU"BUX;6B(eH1s8Zxt'jQjnImGih)I*Ugq*W[S,6*orOacb(iA9D.nsLZ\4[L]$LS.πU"vcPxWRZ$KRui.b8a7&&MmknyIAn%[_^NR^I,;?;h\iEhnVur'8[\p)6s.GD3i)LπU"MUbmMl1z*[vq;Yuh\])<t6&;sW*T_f6YM&<)oQG1zrfQM;zmV6U*Htrt)F?[c[LπU":+Zqb0NwcJ6S-S^XQ.-c,(pgXD^\mh11m7YoGWw>u5<FJ;+oW/1HIE4iL+(zQ*BπU"*uQH#]&upVvDD2#ITPT?dGTH;A4YL'UQWip8B)%VBPd\$rw>_&S<BWpf'-o43o3πU"8YXjaUZa]IY3et/SYf=1l^uUvL$\yR;x\&X/_'prbq+Qd:q=BA0Vb+HLRx:0h.^πU"%7TH2jhf9)rHM]iYoszj%o*+6:9KHYQ3MPq#oiV^oj<SgczKGKpqh#TV^%?G_IJπU"[R8cazWFgR;sdaZ,6\;ixf]q:)*f*=lU/s7K'XB^IWpQocai]5qpi+&+xxE_8rKπU"PD'UQ;r09#<.toXL2V*1]-c-[hr&EtbEk=d,60TzFTkBZ+6>d#3daj-'j-Sv1UpπU"cbdPZFVMsD$n1DSz,V7B7_s<9jN1a7XdY/rv_jL2UQ817v[il%MU.iY#Woj])UNπU"n8(='%.6a+1o'Y9Ruq;I#BwKoD%61)ueC%?tW\7N,lMWn4j=xX2*<3db400DbF+πU">*,g73I)#Q;'#.bVd8hJ1-7vLW7t8jG^2:NyU&tymb6NlEhOo]f;r?Wt+OnY;[WπU"q7vp2%KR:&nFY8ie7m9n=4[a_Qbim].\bAg4rRr20Q-(X[J6HbS[9FjHWko4mltπU"*prfXZ;L>%_jaR$m>wcijkVs7\aw05?Xbw3r,-tv5+*%Y4&7*I1rwqa_rjz2TlbπU"k=0k^P<pky0oQ6'SY3TePUT+1ex2Zq5U.u7Eh5oP]n=MuP<%_^PZ&e%>)64S/C-πEND SUBπSUB V2πU"ro4e'=UjOXfZp9cMqis3Edb9dEagn]h*rZo^_,iTlI>KNjpTg\'4y:BJ;OT1J&lπU"Ln)G-'>.]DR*er\%\1uWHt<_(RQ9)ENuH_&24S9ba:Uj*#dYHuMYO97q+]WGvmLπU"Xe;uSI3_qbvMKQ)k&c8*u&7yOGNJkDz:_&646$#iV9$.b#PDUPr&+*#T%4ltvJ<πU"It$.F3*c]l=[fnA9K0P1#)('ROC2q71oOk(su003WHWMz%q[CB-0N5(A,z=OvgyπU";%2eW5qZnx4;F-YN9sR2e3YVY$'W#OeKg%J[+G+BU[g:y*LY%U:jwM[Y)6Opb%/πU"_z4v;tPST?id6e&Q+VljAVF/o]CLPh8Tu2g%.omohucBY&26?_Ev:ii[&%y&Q*JπU"A\Ve6-wQJk\%pG*pG%DH3,huFDtPSO,\Co]I9,h4$tn&h#21lEJ:uB0HviVl:$#πU"+b^n3rcZh;OTKM;.FW27:=9Lg;zNrWm?tD']Y0hdSAeGKB<Y?aoCoqaW.:iZ.%VπU"l2krqrZ4oQoXw^(cDhPftIgbfdM*wX^U+FG?#JDJ*d1w%i1f*PQ8^#\0#6-O)qoπU"e8quaZvnJ*jFY[-on]Z>L[B(5w,\Yk:8I>?[LgerT]bRI^5_Z3%?1/P;p<de/^GπU"ifb2)s_]0/E]'3<](#/0'GGjlgxc,#DqZtGA?(tt1:dVAhz<7JeYEr?4M#7Q+C_πU"=v0R8hsq/hKNhcmumH^<'tA#QHz/K6LR=3gC.o%ZHCj9MX;WYMMS*<WHS3*1u:=πU"vNl0.EQ^9eO[^=m6kDMq0#3n#8_yK0*eUf=qN&PI2QKTZwu-0UlAEzZ?LUl5_a(πU"OB1yS;OhqGaHwehDIhCpt<90ct.Cv,_*Gr/9WsK3]^q5p;n*;wHZSVrLS?bsQu3πU"uboEZydARu,<Nc5v]]qzOo'dOV4=p*qWWFL=cpo6Lc?V$ffhi+dOVUB6^]](IykπU"'I/cg\nxWv+#+OeW*lE9$d(z\_/J<$Y%vdTWp,9<4i+fW0r:[XOXnP1J3I^GXd7πU"><#5JX%Q+D0Z)zlx^#]tXu2][8MmtZc2URCFPnjOlwmAX:fk0?yYa;$-_ONr;scπU"0(>FLOIZ1>cF?OX:T]^I\q=*<._sdq>xsOu5_513*cJE1y3Q;o]%orNrq6cpgCuπU"PlbXkJ,NO-5CnsR-6DJR#jZ/Voj3o3EGFw=[je'AOi[2[(J_IGKcqFfF.^AH,ftπU"R[7Nn>jJsD7ejN//s,B5QHfDqYAALh6>w#&a0&5xi(l?T4w;-8)KS-5HT%9\1FGπU"X;AEE,eJ9r^mUif2_IWibBmgdIai\.r1^R]i8S(,bbXVbhilKxPN/bZb?DLsV4?πU"dol:v>Gl8>mRp8lGvbD>m0;:qx&%up&'%9%9%%%%-%%P1fF-2s5p%M+%%&\G%%%πU"-%%%%%%%%%&%E%%%%%%%%%hf%qhSf%xrup%&'9%%9%%%%-%P1dfFv]6$(o&7%%-πU"&%%%-%%%%%%%%%&%%E%%%%s+%%%hfqh%Stgo%up&'%9%9%%%%-%%Q1fFmt.g*&SπU")%%&7-%%%-%%%%%%%%%&%E%%%%9-%%%kj%wsSy&'yup%&'9%%9%%%%-%Q1#fFNCπU"+2uy+%%%t<%%%/%%%%%%%%%&%%E%%%'71%%%ukjw%sVSg%fxup%&'9%%9%%%%-%πU"Q17fF&m6W1y*7%%h5%%%/%%%%%%%%%&%%E%%%%_8%%%ukjw%sWSg%fxup%&'9%%πU"9%%%%-%Q1IfFL^?v%(,%%%_D%%%/%%%%%%%%%&%%E%%%%1>%%%vkjw%sVSg%fxuπU"p%&'9%%9%%%%-%Q1#fF075%I\/.%%'L%%%/%%%%%%%%%&%%E%%%'\E%%%vkjw%sπU"WSg%fxup%*+%%%%%,%.,%Q&.%%gP%%%%%πEND SUBπV2πCLOSE:IF S=45AND B&=Z&THEN?" :) Ok!"ELSE?" :( Bad!πSUB U(A$):FOR A=1TO LEN(A$):C=ASC(MID$(A$,A))-37:IF C<0THEN C=91+C*32πIF K<4THEN K=C+243ELSE?#1,CHR$(C+(K MOD 3)*86);:K=K\3:B&=B&+1πS=(S+C)AND 255:NEXT:LOCATE,1:?STRING$(B&*50\Z&,219);:END SUBπDave Shea                      FALLING LEAVES SIMULATION      FidoNet QUIK_BAS Echo          09-29-96 (17:52)       QB, QBasic, PDS        66   4283     LEAVES.BAS  DEFINT A-Z:DIM SHARED K,S,B&,Z&:V1 'Created by PostIt! 7.2πSUB V1:OPEN "O",1,"LEAVES.ZIP",4^6:Z&=2933:?STRING$(50,177);πU"%up()%9%%%I-%HR7bFwh-41['[%%,s%%%/%%%%qj(f%jx(S%lfZfPZyB[U5OiJ%πU"z&Q&h?.MLnB0)0bK>0&:SPZ1)pkSN3lv:D8MduV('d_MF%9u8onYg$RneuZb87sπU"XqBm>J0Xfu80snfp&.^?cnTbDLN];AAb^_b<MDn?Tpdp?:7_onn3f-2d+L>fnN.πU"m8ZJXDbLNj'Q7]9R*3#ak-8<FT?ns&ttnT],g:vzoTS1OIZ0;J+W8s?Xo0X$S[1πU"CS=l-X%mult>x^\kdpbntt8atp$brp%8ZOcYz+VRM4v.Dsvr]'L,+V\U,M*tMhNπU"j]M+biLxl/Da:MrOF^ZMZ*]t2>w3AZ2c+<us\G$aSF_^tsf8nbhBjK/W[CN-kj:πU")he%]idbfM]jPE_+jQ:<TgQoTYMtM8qxtUl$wtBxbpNbMbMb>n#h=(7CZlc0Js_πU"#i[28mAA[m?Tsfit\tY2'Btt.x$<JEP'k2TC<v1ZBp#'2D$:QQ2So=S+SJ>YikKπU"wuXsm2Irc*#r39(F5/&FP=AFnp29kG$tB'FY]Zgqt\<jd8k.uN<rrBx2ZxmtCo8πU"j80?sFp&k.^inoTbv51Qj+t^33#Ft&vovf_w?'Q2KvtPl/a:^Sr^^qZM*]rt2'3πU"KAZf+\<u\'?Pa0QVH8O>>LsUKGn&],l.P5)HO4:]-_sJZ4s5l^WP5i?pFuv/;qnπU"XT-w8&%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%R%%in'πU"q0up%()9%%%%-%*]]bF4,<Yl'c(%%&>6%%%/%%%#qjf%%jxSgIfxd';,>[]^9LlπU"[1d+Di=*T-Ge.9qg#m9gX^i29+<c5WWjxSV^W'%LEsYvpdKd]X,Xce7oZQ$WBhKπU">]f5WR9(L6;5(pAvYs=6E\jba_U69EAAT08j_r9L^4t67>_Lrp#OfiEbJ1;*<DLπU"?0P83[,sZi<MP(3d'Vwkqgi#Mpau_*M^HTiM&wHThi&KE?DM5quFDM54qFzW[vPπU"6.%?vP7$pyi&=qMciT&uUz+9.wvSz:.1k#()MTCj&-]M/k&>1C6R>NuLYCELh]uπU"xS79GnY3zYOX6MaXF>WHnZ4D.m9;B;v?oyigE&xGd4X'K)1aC$v&3Lg2K#4CBiMπU"X(DA+F:<$i<iPPa85afr(nFd0TnNB1VE6<H/dAa.so,V#TKJiS9h2$tF75&(OTwπU"$hES5P/X9>/qGS4mYOm#&9e=cdjJWjTm87_A-QJpxpKHN$p^jTpE>_uB]TVXa(MπU"gbf6=nG<$IAFl3+74StC_fEln1c?J6=-QpPd]=x)rPbRZ$)Ql7j/tDola3Q##h:πU"3IGY/\cl[WsWpqi19=n6>ZMDPbK;Z:k'aLv;PimL.c:,-6NLZLPbhMZ:s7'Lv;-πU"Pm*sosR'b.,HxDg[j*LR<]bVlC*oa:0kmh$^sumR*sspqAGITdLtN(%bbGte:SnπU"I#1I0'o,IFt8t(X,[A#g7J[x'>_W.qkWGUZP<Qj(a;GiGd=ska(LAs%Hc7sb_7sπU"YQ8F2wiR=fJ]u(Y(9r.Cjbn-J]wY'R9rc^jbvJB]yY(.:r-jDb(v#q:Dpd;6o>.πU"Fmw$.0G<D>^a^P1E]UF&[5<n6s>C?tuFfIfEI4ved(Fbp7Xsp,7)(1%qf28ppVNπU"aPcatcc\]L7&t,WfE>(6n3lc<rGFTkHGR_]tKh/%=F3#Yk[k-,;r&?.tvW4)r?FπU"&H6;[NnFigOQr*8m7dD+;4]N'_p'>YK,03n&4qC.#CK-'ZX9I[(j.;O,FjchkCPπU"p&zQlS.i^/A3CX])]B=j;Qt-S64FZx7EwvJK.0.nI>]pC$exw'mnyUnCXg;Iz-;πU"MP07.h(/;Z-rL^zgj(2gx&;17U-V+x(QI4161;B6/syn3;6CXq6+_+UmOXcnCg;πU"rIz%ged9H(KHZF+8LKJap&nRp>P>74;IJE;Z4=9+pA0/i2cPhB50/G(F+_q0,=gπU"J\UW+g?Hk<%1[cs;mr-NN2EFvSNDGHRN$7Ayun.6:<:W(BdFTYkQ^<?Z]WdHYkOπU"aZ0iB]U>^#A=0QC8.3V9d:XaY]qs%O;+1;2,L^->%srD%up()%9%%%I-%PRmbFvπU"O(tdH)7%%]6%%%-%%%%kf%qqSudfq,Q2:]sUm1)YxaPfBsO-]lkix3Z\PA2'8fIπU"1.lE)ZYP]rbdw?uvlPcpH_)))LZcq<F.=tvvpdu3nt4j2RK7ud3vkt<2vot<2vjπU"P<2LH]u%Q'l=G'(o*XOXus_4MMANjC:<wBmT:[ljr9*^9>^&7jW?^&)2\TZj/3BπU"ESsKoR[n1w,L6c:)fhlZXvQ.2g'MmdZXgJiZBik:O>?]V84dSK>Fl\Z1PQJwi+sπU"qCx*T-?*/-vv)vO&WQ*+v)XS,Tb,qM'SMRV8jI=bif5C+R%d)^DBMM.pVw3_-Y&πU"SBiw13d5]oI5Sr2'X3DH_$)r2%OD'JlMR(pbr:7IdAw)t21UXOC.n)[mdG%TC=KπU"hW;YiAo2,YQ%=%OXp27NN\3SjN:Im,6[&<Y+bGl0fXhC<9Wh\HbEAdCZhe8nCV)πU"pZv%E=O=du)xHFFsr]O5qIYp.mW#m7/3eGcJ:Vj_*F;g3<,PeL$8[5Tr\K]&ZR'πU"5WHN*dQ\kjkC610ZbFjgR4N(cMJWX*]EE3$D9c+4U?C+9WXe;[t_WnQYB>$g#5'πU"j_yK/J/(G60_bn5o(Bi?u/ua=n1&d5Tb_O0\F4cesCF7VYR8n](4q8EXZQn/Ei?πU"T%<^Ncg<dV[7xl2xPkDAwj)EPFA06U#/Gf&+Du$gh+^2eu0)-]F5Ag87CO2./TDπU"M0%I'_y\5Q':tEj3Ux)rmPXCwpQsagQ^jm+BE37n2#z7OchOHNEUw(.HPrAakT<πU"OIr+.TS9;]Rm6.,NSH\QdUc9g'QXL7My&yHLRRin.rN*Km2F(7oHImQJf5Ecr*QπU"5e#0y_:34^)4B,G:54jKVHh_4.8^9V;+Qe$f1Ak0Rplb-T5Mp#Sy%d;cg+cULgLπU"k<f9G--E[4AMEn+Dgev?6IEp4#-?[Ppe^CtS5sn1-H^[D,aaX(zTaT/jU$:\xXPπU"K)/%Ic[l<AUb=^Di(,8&#.Xz4d,KC1N4NWir\g5d,$Ff%h*Mupc*O.=3T5jS3b8πU"9$RK?8nf)B4hKO*^uk_*Rg2IL6/Jp&\Y>^C59(X=rMVb]Hqj4yGYi.M#X5[37&MπU"9#dW.=;&gxV<Q-2nYYx;)YCk<RWwu,l_BG6>Ts%9/NtH[N>.F;bM5R?GT&J2j-:πU"7ita'M5.q5cQ?Kl;fDUnlS%R*Q'[OS$>H4+>AW,qtu\fH'blQV>,AqPZaGp-mU-πU"K^j8OY)^_MluL80ZR)M%/7_g<weQCGp_ySQ5\%T]u*]W71vTJ<=^SSh0_o/#pXTπU",[uyT-\#AFrLGQ;u+Q^pj<Azhz<AJerWAba,ZAlcR)($WPNK1%s;GE<dsyi[AunπU"ju0t-7h4(z-#&KjNm&rd_pT_oplv%,up&%'9%9%%%%-1%HRbaFwh4'1['%7%,s%πU"%%/%%%%%%%%%%%E%%%%%%%%%q.jf%j.xS%l%fup&%'9%9%%%%-4%]]bRF,<Y+lcπU"(%(%>6%%%/%%%%%%%%%&%E#%%%-%'%%q.jf%j%xSgf%xup&%'9%9%%%%-1%PRb=πU"FvOt&dH)%+%]6%%%-%%%%%%%%%&%E#%%%?%+%%k%fqqS%ufqu%p*+%%%%%(#%(%πU"u[%%%2%/%%%%%πEND SUBπCLOSE:IF S=207AND B&=Z&THEN?" :) Ok!"ELSE?" :( Bad!πSUB U(A$):FOR A=1TO LEN(A$):C=ASC(MID$(A$,A))-37:IF C<0THEN C=91+C*32πIF K<4THEN K=C+243ELSE?#1,CHR$(C+(K MOD 3)*86);:K=K\3:B&=B&+1πS=(S+C)AND 255:NEXT:LOCATE,1:?STRING$(B&*50\Z&,219);:END SUBπErika Schulze/Gunther Ilzig    TGA (UN/COMPRESS) VIEWER       100775.2275@CompuServe.Com     10-17-96 (17:32)       QB, QBasic, PDS, PB    409  27077    TGAVIEW.BAS ' To extract under PowerBASIC, remove the DIM from DIM SHAREDπDEFINT A-Z:DIM SHARED K,S,B&,Z&:V1 'Created by PostIt! 7.2πSUB V1:OPEN "O",1,"TGA.ZIP",4^6:Z&=20018:?STRING$(50,177);πU"%up()%9%%%d-%X17vFPx%B(h5.%%3x%%%,%%%%yl%fSfxOrN+<,BT[7uwEE]sdYπU"L.Lr3VaD,\P\W'2#<bi2pUN*l:6F_r%a2oSU'my%-^utn#>I#fYapJ*g>Aknq$*πU"91&QVmL:QLvCGCLW[q7/K7&\/WWxiShOChai1MqjRB-7GGrGY^;4wI:YID<MF64πU"md86\F1HXAS-I(znh#EIn$w<uq/amqq?bYb^;d.'*t5+rqYaYefrc.\ZrN[_c\[πU"O>+4U<;oKGtze+udWJa53Gca(HmxM7L$:6+M4'H;8.yp1,xa939eGHHTt'HiY8JπU"-D$0fhsSpcJ=SIZDZC5&mB^FOF<sm=-(Ay\upk>hr2_m8UIYA.S49$HOCHq76ECπU"Hg+)[^oKg9$7svvA)K;-v8W>P'5YyQs>Qs<7kJAFWmLyCRZ,aa>p6m5o*Svq:gNπU"8K#M)IL?jSaq$SPxaeZg1damqV=E78P'XeTB)X/A)ivEF#>:&#^R-QiO/'YJ(zqπU"y,hr'ZuTiQk%s>wXG1r-9][Q87D5jp&EC#p'sKZPT5Zln[]k3*7kPs'C/Asqy,]πU"YvT/bHo)sY?(onFzM'LclpIE2ol+aef?D^TrMsGO85X[UoP;/=/>MFk$<&DV*uHπU"KH;ty6Au$Q&-4dH[YfUS.iooJ?Bm#D<01?5Qa#njm)/;wGP/G?7vOFm'Q2Rx[]NπU"-SBc'WnCI$z>byGD5a,r5^^gpfx=<-n*.ysZNm<yF_XHva)oUF>J#<g;)4e$GnHπU"$^AsnFs_52IJ*:(kgF_D.?N8BFWu:^Zo<U4F3m6(fAS-'E9o)&4x.I:Om2Up)p&πU"?^=CuD%*V91:LVaHH8N]l\1j?eex>d'Y#HT-%*au*=0:LMo#;2^#Qo;?a$$\N\,πU"tSuolqO0HMXoLq*3+3Td>J[*?hAnnY3wb.JxfFr+yQ,KK<\X:A4'uOfQ^uhc=FRπU"X(ME6<J'V\Gp'3m*n]t%A5$K'#4J9s.qjRcJcw%XX&jlZ%PlJRtI#NT'-=rIewTπU"ckNKPf=G4Rpe7z&5A#r/Qu#iO\B=n:LTbzs&mLX47P^*m/5,gbfq&>X'TNAAP(qπU"uHqfH[kA-EB(6$Vyh-OcpIsnWXzw?Pqb:sa+mb4Fx=Vd58A+M_PWAvt$JH6Sy/5πU"S(K=fV*cp8i2eT)>ITTP[*XiF[HvB*nDFF,3TQp6oWLhS0SSb((W>z%Gi&(dq3?πU"?9zDPVLmo(W+g.?(P%ki-ok_Tdx1cDc$bN1aZmL6JG;]g)vJ2#2t5eez>?X,t4mπU"Ci>*ej#SZW'3I,s.mI92KhbYzCh>r%&u\yI*4xBvhBeptQ(vxl66G)Uh0*p*[*GπU",//O6=m)*Q4JYXeZtI,'y/[b7>;T94)+3la8PAB939X0T/'$W:;KYoRD6E+ag>mπU",bqcQ/VGm=p+d?%U)sY2Pl&vZTqLe8NfQyZF/hW(J?1).e47GXXE+<4q8?>WdYOπU"\Z18lNG^n-=*%5mXDVZ'0&T]p$[>zAZ##srT(SJt<bUn1,g(EMfe6Hx-+:23bBpπU"3Vp1I>\Vi=Q[*0O%5')$(Zc[W^W7M47Mg[LPZ.(R'h=)gQpUR*$iz7ndDiUT*'LπU"<pIIX<Quf.2q)mWCqiy'9qzLA>hwA=kPDml6Y#cvCj#&%-Pt\<iAr-GMT:u4besπU"GGSxs$/Y8Q*x^=[(i,CgxVf$wp5.Q/<)-xBmHfMWW?V[^In<^K*g**fSF.oU.9#πU"i>KltOSCYea=y1jrm]Aqiyf3:L;S9#IPx2,eRm%I)Eyn6't[Q2d>z^MmR$$r(CbπU"%*4E1iijo9<ZHI+4u2B+Is%($S,f,OSVB1Mcko=YjQj$7k#]N[g^:_bCr\GOMnRπU"]Ld9/S3vHvN;4*>,xY1FA12M,ktz]heOU2GeZqP*\Ms8+x;j5.-jumKRbPW+/S_πU"XnPD]4k%s]jn.2wAJS_Je0<'/$eu7=_H/MKSt8NC)8u,%fNsJVntuUVB\HLI&y9πU"1k4]&y?iCe-)[cX/jQ*[=SNSzy-RsrkLghMRY(C\[>=Xv1*>wH?Ve?v)m;WzZ=fπU"Yqqw#nXMGcvg9FACX#khR=rAjy\H7djQzL[MW)/10UD?djnhhiIKb9T97QpErevπU"3fQlc^Y+E*Xc]TvvqCM6&Fv=]aJ4GGx[MH7f)AD=j8nEcp5\\F7nn1&fC7=\o>>πU"$ukWWMPmThLic8k)hLS;*0I&RERW.%Y+O)-DQ::ijO>Ij5m(L.#8R?A#1I#Tjo)πU"46'0=6YCWy>cbr1+9f4527)]KaZK(SD9l-5/_fjj;sV/Oq)?g)(MNyuE\sV]oH)πU"4ue57IE::/P^E6p>$GWU5#/V-Re7HMT>Of$v>k$KPU']3Bh$ufo=7<ia>SCp7I#πU"+Fkp#UxbcJ_9faZqsNLCzV:F_7WYT::<L9JA)CjTp*wFmft<l.3C,#IbZP,QY(\πU"mbi9Si1<Q.b3ecPw(^r/>=AU>HnKIqf:zATg<4.E/a%bI=IHd]<_AK6NhPn[oCIπU"\'_89y,5E^_1/+/iL1GVX0h?7pvv+yiqK(uKo9ic:J:F)4jS,ZWe#)Vr.SoWAd#πU";YjKKe5zfHLm9kXHc?[7<UAH:hgaD<SJiF0<Ip$';iM0BBf.YNM)uisf*+CI/.HπU"*'a#LUhNYr'R?>DLFbIhfL<RVS*107/fA_yAyq2XGW,,ouw#Ot,HN%0S32uDO+YπU"Crg;8:)f+<F)t/(Wtw6n0Y)g-$l%r4S97Y(A>8+cx3fLX0fWF#K#MhfQ2zFs%buπU"Y-c#E)spd1W:0b7XO[-SZ>mVpWtW$1IJLOIE'xS?L6N4o2Z98?un(w%5hAJN1b?πU"g^*JzZ'7f'dao;]Q7B7jcJis</'5fUCBd\][Up3:'*p*:BVuG,S7IuE^*/&My6[πU"POpnF2v7-ZbPsl8/;,IZ-[rlDi2iPp9oeWQ-e1lD#Q$4sPuJvMtCow[s/NJubM5πU"bVivj=&]b)QK%nA%lufO$uskx>D\-A,<tp0_m\c>R,D)bW2ZUo\u6>WWTZ;1%%mπU":i&+Brq;Z+pYht*/'9)<p/aD\/CaJD1Psr>VnsPn.QfbrUM*=PN$18-,rq;/Zp<πU"j?t+[Zjfb[dVR:fBK<s[Hr)8>Ue6hn2n,B\2S<GLImy#M&,lj_Qc)&fVTW>8fjgπU"Do/.H',uqSp&(<9o7I=oYmfuq/pN?b]$f6om5HkIPg:2a:NDUh=TJDe$JY$VEGCπU"hx__9+wiw)Ajvlx0GwReVjnI.tNsp:bx7bI8l$1IBLhBbo9jZ?aC;,QhS_/r]<HπU"M;.p*3ZI0E5DBL9=9H-uh63D_A1gR96*=CWNM>VDJ0DjC6\*,lG?r7\.?Bn;f.mπU"T,H>mmUrtNa#&OGJPS21huQ52Uu'IHQ3l/Y+4&.g8]O6(la&?VHW2lNb3Hq(9'*πU"uH>#1EXnYW^A(6Z(>=)4([w>$[-\ns;9=xR655?r+swRfrowEgH5/BY#Yisf#eWπU"^,u]uXof885dldD20^fCW#>4*rzIaw2butMUW<L\5R-[P&DHV8teo5wg.Nm:fQ7πU"_',?pPiLNj5o,<Qlt((IBR_^^uPAr#ev5Bo);saaE%TCKE&sTO_WfQ&+nL^MC*LπU"WZ^W:;<A-Flf/vDQ(g>zE)_xHp,'VXOt#''Xq,BcD7Xp//B$ITBLp<kf5LZT?p%πU"[kS=^\jju/Nn.].0[5(Twe<V?,WL*<mUfg$isEldsTTC,mFloTD'TRp:=IPs.DsπU"ljj3o&dcfQXqq&:Z=eqv?jQ[A7a'gBMa?P)V4z-]+J#j0XogB0sGEXp&Y*+_'o\πU"DB[b/i>Gu<MlYkb?yGgKFD2/2M&bGJN=]JfTeS24DxFncO)jF#C^JBrG)X'&ACmπU"hsbZWm5wY2Ue_p-Ao#QwWWdR9)ZpHD>.pi5b_9>rBQB#Q%Cq?am#/iUu]B:V_71πU"wr$92oeSpHA,l-K/vs(m&Bt5N:v-h58+LTpYE,?mTY:f#DlF$*ci50N/sK<HPf1πU"EQzlJoQ+g$wSl5k)Bg/(4E\JQ?*%<=>&HPEqt7kt%Ae/]m)+s43ulvDls^WofU/πU"]&qOv;hU>;qJ=p]p,p>1=aAd$<K[W7sasj.oCoK?smC008Z[VY)VmRg9Hs:CZSmπU"g8PHMa]4Ifsw(:U2v,u_4sl-3h,dKQd9=>tX,<es8zdEK_kh1QJ5Z-b=qHJ'74kπU"<R;ZNDXAS=E*OG\Uq0Y&8F,KMIfObtY0jHYi%kP<<%VMK[,$^0BMk2p7[GS5S9aπU">cU^Xf?D_*g8dxg2Tk$c<Q%0kGRdhv_mt8^:1QI'BO<UNk)jwVoo0<7z?lil++pπU")Qlfe7DEND*vB\/#ZW4UEd#T4uY+F<;wYx7/udCax/k&Qr6MZ.>HrTu0.wPtm5RπU"wTS=&CamoEH\uZY4/+t0ULj&K=9&IRh%iSmo8#vUFFv+(j&&k=](FhTZPR-M>1mπU"1BeXzF)QhTs^A(gG4XsYuwtMrp]J&p.?CqrN:fFFkfhS]v?M,Cr26PH:>J;?O&GπU"]%djILF+_cU/8t,NM;E.spi/SjDcoOb9Q0;bzw56fWQ2tCth-%t?0JL9*.\qGooπU"P:F5:V77jE:6eZ$F7$0Zq3IYluf.Plu$4oDtcOz]dln(lV#e[n?)n#R*%Uj;1])πU"'%6Xu,KJ^ndXPn53'e+/L3tPVaz>.E(:(gJgYTu/JatA#>(=]4vR2Xmul:Bbt'8πU"_0.v%zNcM<];)PjbEGeH<:Eh,:=#_NOW2dhlq'dP*3<u^p;VqqqU9oxEa0SxqIQπU"uO)ETD%d#ctj=shn$H76kJ(QnVIl3P;LwUuU,\Pnt'r3lin2\P3=g1K;2+fU_9#πU"q<9/H+8/ND4SMo[/N5+\A*,g45j2Ho^2I2R=x_EL?)],:>*l%LHqwf9VYOfinQ9πU"B_;SUXMmV/K^V*U*YHV'3EJQ>)$nx\vZ((w^b3RuUs1dmr];]Ng3QNg,ReI-G-ZπU"smJQfg<CF=0RjG1a#AAb=4WdG?(y'$pT:,jCoo8WvhYpI$7;oS3rZ;hxd'&'>MhπU")TG4'9e/v:YkiejwA?7-,JVS5hJ=J]2*q)1Mrr)%3>hcu%lB?QGkjg15cjV7lqTπU"d'2W0j.,]H$j;i3jJK-DvfMKZtqd=Lt4O\9_KA2?0oYOP>]oaA=fpQGT-#W#mDKπU"b?+m0*v#/DAc0WI(q+$P-n2bBApKg8+LAKkmAc^oYlr5,uQ5Q/N<.8Yc3HUJ3CQπU"$ek*M7$mx(c98#H4I9<PRJ(w0zoS.8n$Nwqp<0'dYMBL6e7(hns<#c0JYI%/zf+πU"LN$uJsl_vKYh/]eS.Q&u_>Qp_RV[Z)*?D:oao6J_w5-d9,C&FPyWiG.VeeSoNcwπU"f-#vNEiELVI_KduxYLr[N%up()%9%%%[-%z17vFRN'kYN6.%%$l%%%,%%%%yl%fπU"SgfjxV+VYATAA$7-zb+BsMlCK4h+P_-3(G]/gXl-=)&qsWmsV;lq1#-1jcRf%:OπU"FG24e&ZrSxbd]Gh>cbr&1+NqIb:HK:[**(LWXCpC?pmm1KUDk,*o=,UEsC/rb(1πU"AGKBBT5?MW.E-cYt<tNW[Ha&wAgNg<>hLynXf,G:BY40H>N>#>l:(L*HzZ\nD,+πU"AfK3*h1Wdg+H\HtJ&LW1-m#FrSg)(H#RH]F+pC,KK=u0p1r,Tc:Y/S5,QVj<YSlπU"MDu[v&3-jIcG4&A)MpRn8HE5UO_Ez2F^N0.UKDLJ^6[fa)/F0Alp:NxAf>Am:3UπU"*#+De-WRL^#5-Fe:.,lSSSO8*I,U;5)Qf*eLJU_A50xA&/I?*ZK6ImXSqIuxN4TπU"MS%GC%[ABhuT/X6F$)_lnF,i-%vMa?.+.\(;i7A;Fgw(yPN:7Kpt*uoEj7D2Oo>πU"7AB[;Y>1cl-3iHoNvgx>G.\0E5fIOqw0mFbqrB5,3Xb,i==Emn<-+qV;ME,S>0%πU"fH&'b=aQ_[Ymm[JTfzU00#n7dkFY61EP3k/0nLD*1Gmn;,/ZGqEy#o0npJ;8I($πU"e]Q[Y#3jQu+7aKjBHR\'r\7]37$$_)>'_9VjgrSP8C+Q=k/KkXpe2-vI:cQB_&pπU"q?QlZ;H::Y[$g7P1AI8+m:b&[eRsRdo[T&bQ]O+L#\>lY*/k/I_4Y(&Op?EU#uOπU"^c4semj-BX2nWZd4SUWpXEQoT?MZbT<\P1fqu]D<5R/gY%=e9WK_rK91&6XICeuπU".f+42p*PcU%1amgRJ(Cr+])0_54B^4qLH9=4lH(&o[ZjE\KeW+e))5oPWM^_t(-πU"a41)]38kd6Q4jJAd=k&.RisE)GfT%&'g')j7aD+Tqwb9e;Oh09Tjn_npD?Bg_y%πU"*8\(m(3UmnogPw;M)e\i(\CWEI*hlfg[Kc7QPlK_1HDScdR_vsC.Uq0/2U(Xvj0πU"'GFKF=YBS?n;hYfg94deFy:;d/^\el/CM1B)%J*:Jn5#T'ZGaY9><az5mH<E8,QπU"M$,V0im;FNp=K773fZjUuog5YJP6'UE*j2Of-Mf'$-Hr6SgJ5z:I-P=i-7e+j3FπU"HA^7N2oSmU=R[Ghsa:,ZriMSa)z#MXJ8e_P0BLqD+XGPEm=)S^66CdQU$L3iFn%πU",,D$7f(v8Xok'7'WgN8UT0Na5[5.j[%2(R3+sy;6mmz>P0N5K87f$R/SVC$DO,.πU"ldC:D3T3LwQfONck4+tq*%Edw..FK'c5l[37R,w,D?s=iT_LvU1]6GHdUr[%NRDπU"kGY&[Qb\Dx6h1D/j>]Xo]&w%Tz$Ma'FM?]kru+IzCz,>i[]$-hP?*D,tK][H268πU"m<9N,g6i$aYkB1?:tKH*)p,+I)u?Iw6Co0JnD?bd;wd^Fji0RKDc59&jrr0&#LxπU"m2l'J)==%^ReY+P<7aturLaJcy^Ol%gn0AsA1Njuv-7'[ehTp=<r4T-yCT8ji2jπU"Ewa%s>QcbMPK9R=^JB%Vyl03r'H/TC4_SqewiY6^CA;XEj-zKlH]X<\tA0?CjqSπU"SR&Z+m^5&/r$W<Zd3Bg<u21JItm(.R-jRa'ip;)&O;-tSzC\k3R.V'hmGpdOo0/πU"*,0.39_?RBA*T[tE.:XF7<>C8)BGJ4=cR]^7l7NXTb;h]Gl?6Qh^iE,-ONFVfXaπU".yqUZH<>AX)2WQN>l2m_3KQXo%\qc^Va;G>PCA8tAKyL/HQOu&.[ZqXfjLI[1w%πU"Z>YO-fbGf4urcMjn%l+u>3gs-i0?f&jT[\(mgnW?)KPt1fUIH#<>fbQ('%'lU?oπU"X3(GTZZ3l+ECks-c/YY_WpXZg?[;1];=sHA>fgWBWzc*Ch8IRH1MZadhI%:ae*cπU"57?4G,<0h5k&mzo9+9PO*8yI(nG^k=x7XzlTX$#rxMaIt5Bg?&%?5$vUbE6%v]6πU"GscEeo;0B6>&v<e;upX-?5]u&N%u;?:R-VjvLBN.IQiBb>n\lR&Y-I]d<>X2'sOπU"sc)6NjDws<[;LR44i<txK%Uh]FExWItV:k$QWf7?WWcH)57kJ29w/D<8/aMyNZCπU"ywY=?0H\yuSdeBia:EB1_trj=,TMHFG'jx*8YrC&.UlW[NlEu8-JmTlXa5Eo#;jπU"I'Z77G-lQoO6_3)b;KVj.Q=,&2duy)9_]K6d-?<WBqJKbJd$5X?1kEFboz1+.eIπU"TkWcs9d3G:&AvR]<M-eI)2tJRy8Y9L>0^7DDCObzZ/sJYNs6NKv(04b-Ah<nEFwπU"]OdOl8es2HX9mAd]>tkc?\B:WIO%288a5^5gmXI(Gv;6_=c+*T*'d:TjcWEH0O)πU"rs%J_2Tzuzf+>sT_*gfuSh8gk(4>Tdu.?$6;l9Z'jWHdNl];,CH_Em?RljO0JP\πU"TOC_cVQ1P>;Kk60&5O<4-HS9/Eorjf\3OcVLgUwc>3LpRKJgPfhN3Lv,#_bU8s7πU"0kV2YS2QY-fNAKE35.X&br%280(Q7^F_&Ety/0](/6Xg5mW'v^-c<H$EcnDdC>WπU"slfxiE*eEU?G.X3/l%[.&EG1OaD+pIW.g4F1Z/0GI2ffI,AyNGv%*G-;1a-UJYBπU"t]P4-%HgNUZi[cj*ab3a6P3h5J^\Xn5E5D04AiE.Mqe%\GIbGn.YID(_+r96_OeπU"RlgF284e]bJ+c=6Z'Zqco=*[dbj::AuQojsI;sV&66T.UXtr4EJm][7&M^z1;(fπU"PDYjfCw3X?8gZ\2G#U/z(yOEo#Gj^a\#u01we3]bQ$XO^h._^CQD+Hn,D\0Y]$gπU"MA)(Rz,c%fF7gZVXPcl,]'TdA\,rd6VYiv&3P;=4ACNMuJ.n$55\C<1'F2mp'0YπU"ig,#gFkA5Pig&dWddYlB80bg:Xord45IC2YR)%<)FMrTPK6ZaF:aSL3MdWR,'.=πU"^,0XSM7%mwzkJ'JtG-n4[*=5jYu>E3UhK<36e?IcOe5uxs(xrWCvdj8IM<P9>xwπU"M%3h'6'v>tOet^NrXCvDj8IM<5tE[i3N*0tu^f0-.Y#Sn,t8d2e<s%WeKV&E>WNπU"R.AC33Sj[x/6fbir'cvLIfGPhV$;O/NfDe1Roo=6:iVx7Dh0#.lU/]NZg'Uyqg#πU"vf9'%tjX7iOXfEdny7xLl]QkSDzb)ZNV[?p.b.q]lin*LkV$']GjI?Bu6zvt2GLπU"I<QkqcXG%pl.UR<aTPgMT[w*zfVn^/..VXK(k)$TI7%PDzZfxXpbpWO-Ko27dtBπU"v,J$e>jtrH\lbZ8v&&C_(Og/%i-IO:EyB*s-ctKP#t+HIA.C0en:'J(ksbnstvjπU"olX:fc&Zlak\GC^pt&<pQYhNO([[T+>&+dk,IGhCYuCNQQZ_EGXZGg/n69?jfstπU"AtscDeC-M&BfsZ1cDXGai2J$H,4^TBI_6SrQJgUptsNs5e325r]uB*j9#i:x*>UπU"upa$8xoNNS-hL/d]RzhZf:p?hc]+FW_&8F]/dSN^l[38)V=NR+t*Cv^N8D:_jkgπU"*$1*kCe9Cyo]CfZheDJc%\j\K#\^,SPY%M)xLVbv/LdZlH6<rFcoaf9[9w,Q6GbπU"wsPfeGzpO<B3d08qGzAtsfwW#uA0)I-5*aH:?7'KZK-H'#Gn<%\cvVzT/tX;$[GπU"mF0$2IrNu.GfG_x$COc[3t_RTMHj>+N_6V;.\52M0r.Z4Hfg*iBhGMg.jbhOhHoπU"y]S-<SguAS/0c)/5L:$^j+]+w\7[s,%o-L2q%*b\Nrl9IN,,''\CmC8BjFYXgcCπU"9i\R*:^rNcIWCuAbaF/NO-S85WoaWp:-V52xg##>-Y=y(9ijPE2X*?qVYXIZ&RdπU"lLAwi=i^Z'?_$V)BG0?O;BOFO\Z[fnvsV53aemB(?#MzP&o8\BWq*a2cUp_Z#:9πU"h:<1-tu/O4>o<_>,2w+WG=o&LKbq8nrFk=5,k6T:W\Y+O4:Pb?SnR#qzSsDJfP<πU"jtl'^JC[;A<3S'7hgZ9]N$0NKI&lGOc\:(W42w)CdD.+W>+qKAi<\g_VC8pG;JzπU"X#?pYYEE&bYq=*<A$YXM4r\XjBr]3V4h,THi;uL(T-+ic;sg#K/]5mkv>cY4hD7πU"caG%Vh6vDa76^ueawG)3xR(jLX7x4mD>-'Asbo8NVc%do\WS/J*534uvNn7D3ksπU"%K#Ldc&Ef*3Dv3Kt0<N\2n1vb:gz2);C[4L4ZRTofGkeOhZEDfci^=F76]]%K>>πU"Au[lH2*]QU^kfbI,4k1yswNpGxE7,w^C:Es1;(d&=L*M2FT;6_o=*ur]&NAl;_lπU"'jlk?<i03-CAk[^n4RwWUHy?zmUAPci-^D]C:Xev,<_6ACh^-]OsxIsNFG9gA#=πU"fdC>v*K3<a8f7tQ+w0H^?pGgb$VP'o$4-T#GKd0s^MkzP(F'+f(<Jk>XXbbArgnπU";(]p<k,ns<q6wB?NhW$$rFxnDK9aF\K<O'L43$Sk_FY'[LG9lo-:50-epoTqhz6πU"H4f],2#t/0&phbC]:cor55R'm0IV80V-RkQHgRipi<-dbV-Wjn:'ZfFY/xc^OQtπU"EJxZv'e>o2cJXWCSMA'eaFRf3A4#RWW1c1J'M7G6YqeNF7s'NGq$3]29D31*M(vπU"OlEzW.O,T=VuJdcMIJUEJm:\3i)dnqS7Pg)1iJDq=HuD&KQW6Q==7uU<Mmmc?hcπU"SF+YXk)1mlwWQ[u#PXJV7K>P1kuWeG5ju%FBh;#b_oJbque;<*=1=H'#FP;TmhGπU"-%tP*UJS2ZZ/pbEZ'*j5rEAbMOk2l<18U_Z+WSe'V[_IpPzT*?FI0_+cZtsh3AOπU"#Q#[?xk\glNIn$+W:b3j.Uic=opq,I(2F.B-Z&$'4ldRl1H'cYrG2W<R?aFCu?aπU"-a#q-,Q1S$lUm^=&v?oV8*I_GY#tf#^iG2pDCI;B$-dcUnfbL]Rg$h'G?ul4hyGπU"7Up<u=0?A5o\F0uakP$EZ4WZ25+hTd9GZ8%lw/z[$\+)?Hh7/VH,90aa504>uJ&πU"ch//6<=CiZIR5*Zyx<to':lBL.HNq3D\k7c;OcL9)SBnGVh[PpMeKaVOWEoXv5BπU"aR-PdRK#1mm]_Lps28qUluNnDWjJcXzVc-r%F,kg.e<5W--LMYnDL3B*&$$C8tUπU"nFf(T+-qH:B;Wk7Rt-DO<;^yf.?e5W6_T/=uS4]?M.zj']Db'>ZUtH(NIAeB\IJπU"1>FNHQnJPfFl&m<$uXm'm&]=#DQp5wJdMUIG4u#7CQu6$MOZl\JvLlXBb,Tx>YTπU"ab2TDYd%'ouj9#e^:mA.tF,KTOnJtB\v_CZ]Bv,J;[qFn37kk:Y_l$2P)N7,DrUπU"TzRcLc3tGg)X$\qqmTOe<qWJXu[A;8yD/c>e:[4t=LUgcRC4+f>Bn4CxX))wOImπU"C9<:dT$m'1CZXk.<33_puN-,)pa.>Yx=uOr?On]0jZv>\\,\)$XU+g)?5v/s#(KπU")/U(=y_o4JF)7<+sVCRsIilFiTT%it99(_mb19WY$/I%8:rpd'[o7WCJIk6)3XgπU"sa05XrR,YhHhIWCH<a((olv8%nl>3PBs6WjG.j2U5+/lu70om6zT$DT()5])-7HπU"&fD&Wg?Z>$Enfg9^,xGU;%SR%F4ianT0gi(pc.ax.(N]?dwYqH=<<D&41(MA0uGπU"a.?*\t^HVjz5'ndup%()9%%%%-%,K0vFm>HrY%p1%%&gM%%%-%%%%ylfV%SgfxNπU".(<B]Sm7w95yjD5I2G&1l5TBiTSk0=3)eu-d>cErBuoo*<O+uCj7M\t3<ws_jm>πU"6CpE[fCxtw'7XtpX9VbVbtr_jptJc._>RHOc-RofbHlTf6:]g:\.aM<siqfMk.oπU"mRl&VcvDk%EVR279(8<am:.PSWa<SFc^krSAWCS#Nh3Gs^9KJscFgj,V]rXRUgWπU"T03Bi;9Mx;KDA^/Hde*PmLLQ9AeQ\]Ul0B;$SHnS[E1[Ek^P9r]G<',f^KCxtqiπU"02i^-\?0,cCrulkkU7]b6aQxXs\<6OsC.2G$B+9rTYkNAxxmm$[$oPp4j:NdW9rπU"Y6&mFzKc?./s/%q(SsPRG195J-XOTap/9/Qm#9878;Iy$5\(Y)c=^)aqYEQ8_euπU"LS35#R,lH;SrVQ<:kv=E59.A,nseC2&)K0<^l>Z.W(n8rNYi4exF(\:?E/t05(DπU"/h]:5'IeP'31tPk20O<ZZ/0:[Q>.:A'a(?ZUZ&Eje9xdbv&1ph'o:;tSLOr4#cRπU"]1iGwW\k%xC/0N_bVdZ^DwZp4$G%Qv2$=x<BY+h8fXZVYK7<%aK4=)BUdsj%/l8πU"NriS1,a^t[]Ph(aOS#B5-.gSgHg7&-C5Ni\?[0)E*f00,Zh4e2)<2#,?a**gRv'πU"dG0;FOX_*l*s]9BH'd+1+p_O0Y]a-fepapJz:vPaUWBn]OgM9aZ^pX*RpmV\MJDπU"j+_phcgwQ87G&_DM;m*k,bac<VpH2*BC&EqG,FZw(.yYa:Rk-+ZU<wQe9Cue2R^πU"Dlr(Up<5X,PhtBf&0f4R8Cob4EVMBM)hU+(Ib6/]5c[-E.^m9bp/$6qGI8GcCmxπU"$coiZ>;]'+.%UIvh_c-.C;&>,ituc5QRFjF<B+_,VV,2X:rCITFU6BydMMlM:zbπU"])96t(,dH-Wi+/caRK196%ucM_=?N#Gm#TK<gAtWOTk:'hS;whDamJYDfOEOOZ7πU"M<'<&%A^Rq$]/<]AO*5[z%dmQ-lwVZ.JO+ZMGE'c,1G,[oko,hHuLi3bMIRSNUXπU"(+$WXCVG17l#]ejcFrpvG0&An,7gzYD.O')sDZxh:<DGYC<9;DeFaH8)aWP00(0πU"hoO)rqmoM0_d[G3':fBCeWYk\U2+<QO#'o.f,TW$($r771IDe#JfrEiek(#]&T.πU"?BErpRKu_xAh*xDA/52<[-T4\[0(sXm-L;RCNoO8WL-WuTtl[U6-Coy.q]$X+%rπU"MHCU;J,l3;1[>JC+zuo=m(oosG2eRa$<[pi3x.DGra8$L#3)y8M>L]6R-fR^JcOπU"OL)Hdf#Y2BuJv9h%%%0Xu[MgNl&TPLK#WrDv0LM.piHZf;UaCc2C0;$']2K03AWπU"tnp,=,DpJvY/]XL:A)lCYm]$>Nd9OY&dpczUTB9[kDjiRB>OWReY;T:;jtUfCaJπU"SypRlaXn%MJ>g>1cI.*9S8]Nd2ICntznd7\M54*=LG,L3uMJQ'Wi_CSCOP:kj05πU"r'(SVV6oZ=h&OqO70fjw>7NrbV(^HmScT1'O7.PH=YNnU$j.s4hxzmC]RNIG;v^πU"MxLG*u?f&F;IWbCSt55P9yABR*tmJVTOGQ3+k4>;;oG_o3I^QC./9pp[SQ>HOe1πU"L-d+kd,;+Fy\l?kdMW\s]#wUbbL+jQsl<.Syn>5d]Gkh_$S1R4J>dPd_VzlLwmvπU"_2suZDsvCb=+aC#UDkjW&.w?#X\X\vZ0KvZBVOYfzchpIpa6Qxs%&,aJHuFx5NmπU"+L>t=nS.+Z3#q1RgL=0;ynF,*tH(m3lfe9aL[)SAy5n;NM)En'8f_u;L-b6K>?jπEND SUBπSUB V2πU"$4znnk)M*De6URReK_mUK;V=%m.ou&.aw?MrCWs$I/>Xbnh4<T%NM6w64gQP)_xπU";7'('wR1JQD/ZJM#b32D:rkbnu3K,gJpY(d?x:9-JyV44=*<)k8w8]z&9u6Pn7JπU"1&JprrSr;*xgJo<+:Mx[yo]5#Q&0LQ[xQSdy\O,JDRNMi/iSLN\q-=OC(qw%HYzπU"8WDoryP%((b,:9buN(,^NMZalOa;0iLSuP5P^p>)=\??A.WWk/pi]8u(<fOqcO^πU"ARw$]Zm5*q(w$imT6>;nk'V)(NAq56O<pRo[T<4^=%PFbmUn0?h$Cqh$)m;2k$yπU"'qQ1)F,>[oqJst0]QG+/9qS>;;.5bO$JaTw0E7],6DqeO99/koU-7U])vFD_-lTπU"fH<DE2FrW)VDm^Piad7TjiCqTmdDPM7GZ,1G;<R[CzN6exgCj+CgiSd-1=zt6/JπU"h)<WAHnre^?tNC5X?UoFNM24;C%tf=aFE/2w6&n>b2>SUozPkHf,YACaaW*3>2CπU"\kzPuO_;Md.7U-n+mB2ggtq[MKNj=O]Hg/uRVfns%.Y:YRO:E#?9-8R=%_=^^0RπU"vC?g5T14CoE7K_Ir-b9p4O)my%WUCt0]m11unVFRuh4naKTJP;(b^Z34tjn%\,DπU"Ai[2wE8\wW]5WxlQd.*:%Si#E$wd;[MSJcH:kFpX^Pqx_W)tDG2qx-#TX-wrPe;πU"FqQSTUNKw',gc80KS5Vj,93WY5SUuSMV*bGWteMf2?YKxirE31m]JajCvmFvO]qπU")tUj(rmvyNLZ[3)k<hCE9Q;y6rDcyWTo(HYH1TXSTx4[:u5tLkUK*pa]F['<Y<qπU">MIi7D2>-hOIwONUXXf2[,g(mA?V0i_e2o>>NStk_2UStXRjGcDAYtJ-GocZ<VDπU"<k#fnB28j6HI';P<]j4sCe2P?NG&'iqgHJD,$I#w=AJ(,\,q(L\ASENs9?J9Q^[πU"=*aHFIWQPG+,qg4hGQ:aE%s#=nh;Z28vN%t3M0[TSLo6IFRrS(4&rG$,O,x8%;,πU"]Zpr,pjM+CIMp6VD0OI-h49vO,w[7ETMRKBZwN:v:Vj,M&n_?MTQ&kLe?3=g7GcπU"#v=Iff3:w$e0U+t-.G+A<o8V8ht)^13K8u/OMD?1?+e]-jmEPIB'K97HNUTW8\(πU".T.IEO$,E#wg(>CQRdviw05E?4A?&hH9H&)k2ncptdHYMFU-8Rcn=W^wK<AMI8NπU"[c>dN$teJYrjMqnmwOXu]l=?IO=0Mwwm6geYDghts((sr%X$p.X%Lq4MqCdk%J7πU"t[h+>6(UJ=^MVy+<N*i)Hlxbg1Uj*4>?KNccjR815[f?FtWU#*>dSV-A]w<B-<&πU"<h&m4::UM,.0f]RW;GW8H6.ouIzQ2]woD#k&+\*\U,A=*a99fp5K?W\#tVT_R1pπU"UkVXhLg*s*i=m3Lnfs&X<Z\r:tq(Y=rq-i>rmwcp/R<Ja\m:bC)&/G:72k=[fURπU"[Iri3d8wnLg<[D#RP*J)#o,;DJ$6uQ]*koI2TK<\Ror%GHo\TiF>,A*SgQEI%7\πU"Y%vh.nKQFHAVR=l<_j(&Y$P2Q--=55(ner22u*uQ6gvnxVh16L8Y3:]7R=87>_EπU"a*-:);:9]$R$*UvGO$'G\$'SoC7G6:,+e8E3?[U3bJ?#L+U4NM0R#'W-[$B6=ujπU"_oY,xZ$ES6tXJ9X6vStuFl7d8uwcY\jW/+?%\:'S''4e_$/74l#g;63gXZ<MG9JπU"Yj7e\(R.a,DSU\B6Q$0UvaOvXQ381oc#4\%*1CB/jWg3JMp[3ti?9EF?BI5Nu(,πU"xNPjvOrh(?A6EKoaplRk7?f9BT93kh=YFMv8t;_D%R)Y91\nXeC*,v<k<(vE;d,πU"*MuoV*7IZWx<E9wYiXB94dc0VmzM$Fu6^bYDy]9,B]GoX_H+]]$HW=x$P*&7a[?πU"j=_T)2A.5HiR8,akp\Mo5S3c$ma_Tn[xc_L%'wcWT\t-1UbzI*nqvtk0cHlSLITπU":rp#HBja'n6qGLOGPmta7;^P#+<HjvQQO3tx+[?ap5S-P8SLrfSL37]&94*%CsYπU"+b3>9X;D;dOnyUfM?+D=UApgexOfMQ0j\meJ*\\JUaEPQntG]2IDtnNOTOVEt.RπU"7pB]Y.boN[Yu\Y'N6qbLh'uR*jZnbBF('iwJLP[Bc#[gjTCNxyG#g8K\mQ#pLU%πU"nW^'hQ=tbM.cDjZA2VPvq'v+fx*u%p()9%%%%-=%'5uaFVyg-[91%(%^T%%%-%%πU"(%%nj&&SgfOxV)*>BT36hMe6u4D/8s;<nC_MalZ^^$=OB$-r^+Vt$]sBb#iQF7#πU"9pm&fDCa4dhSZ#G-L*aNO;m%T[>f/7vfecTu:0V4J(u)4IWt^Hpe-ge2^;j#+]+πU"*vqSET\sJ:1.jEiSSS05vb_ieR$^'IM,f#C=FleSD2&2[])7;,Ysci,PF;p4s<_πU"_^]gjD(r_FiY/Pl8N1T;,fBS(1V$>AsS'wN-(<]#lT)DG(]]p6uk_:YjM*'H1j3πU"<]u'S)7]<k>dE(j:p^F;L)=fKC.:RPn2NhT>&Eep,*AWO]=kBjU[l6>6*'_2JCrπU"hnxiuRW/=+Yi*$NNo5^pr^U36TjN-iQF0>.iP^]WW7UfK8i#c*PQkOYO=+P_8NeπU"XijF^F-LF.n],E:Nz0*Fh#<)D5brd)9q\lxB.9)dZ6JT4cV.C0/gEq[AO.<+JgrπU">phR.iuv&_aRxrp&'Y(JPEU38nx[mA>V<).LU,04?c?G074-E*n,5F&#hExd;._πU"'C*>f5o-Fr#SQl/WgIy3#RTNYxp7AY37F:K'8L?EI+M9^2,<gR6(wMdxn^AG6&wπU"lFY>jh.2C$nKe/IfpsGZgfNGZ65/ZB;Ij-s-3wdIGO1jgcVKIJ/98mpV-meDj^DπU")%iU5T=hvRf%b/c=Xt/v/YVhpgH:Q3eY=op#i_gY:Y678nQg0RtAF6RM+c13Du9πU"EqnC[C'Id%SQd)-sIqzCj.3J\>oqT>/kl_.hH$1'TD+rUi,BvCkf#BB*t#iRrsCπU"-/ssubY5VI*fs&P?GrQUp$+A^s2sMCc#k%Mh+/e/1yQ#S(\oE%H^]i+5,=uMPA/πU"r=yjDv7.WS2hrycZY6F9r09]]oe%lA^i]wm,lN%QA+qUa[-_x]=_lz<?*6h<ab/πU"u:\1s9JBRq36^XHDnGFM]yQK(P1(e$Jq<iwQT;8.hleu>Yd5Re[lR\7Vz4(m4e9πU",TKaMnd/[ILq+YPi;78MfkG9dU-gI:;BB^a3aJk)P2l&wQBTK3(Prqb16e:WfocπU"z6eb*i+_/y+-0\tB7SelijR_A6a:sS\H39xcratk[608HMi&z1oJ3:pq%&cl#&0πU"L38/+<H6Ck7D%Rg8FM6V;AG<0$*(dsKAst=-KF0-+kAv:RU?eJi^I4HbVx.>jOCπU"(fFN=\J^f8yjr%%ZtCLX5]H:+3%sgAbm2pr'+]C4G#1HZHGwp*8G&H&4BV5-v_?πU"qW/$Ojwgq3b([1[$vWTGHMu_?g]_3-6dPnhg+V;5wNC)/%[5Q#j?r4Lw2LXJSMsπU"(k0cZ3Jb;-#In$m\OKA;KjN=^67+y>VMTYvFeu:(GVIYr6(n78i+6kWXe\>*a-PπU"r*8*4)k3D4P:)6LHj/KP6Z3tJy4S6PfZ(uyiB8/&FI[a18jlFRj_Q9LJEnU8bb[πU"B2Y]nMx3/US<I7[Y3oFM=u$K'1>HuC;X^]p&9NZT1SFuhP[FI)2$teOU)X>$D&fπU"D:\-62_96^=QOXNOl,m[qOVR2Nd_v3fjixK?,fBtV^4]*G&vl7hmJmBBO:P?D)gπU"iqH^PviKc]kJW/A?XAc^2<K55EdCk\1g]LmK?hJwJQgfQcJ7UlqRu$Ic'c^*rWvπU"W(HGmY*/Vl>fVZ2/kY^tlWM9.e'ydj\yfajJuyo\^JpI89a4S8C=]+,Qdu53InCπU"fS1'+nnB<,X'[WT5Y&JxsUCv$ARiZsFN$tb*\Mp4l6<NxfR?A&m+RM-Eppum:NuπU")P09Wsr.xJKOl/&'Lm'MTN=DS=SZypbS:>K>KRWSG%EDe0fe3WIgJOJA8NUYBQJπU"N=XU.bhV04$+*/D^C9exVCsr>SrJAB1XuLoJUB_+53Q9h.2twZM*9qu^6TQr6<lπU",/PZqiD[tb^U,10+%Jbfn%P8V2'2]/44)c60kVYYR_cTT6o)qyGt<Rn*daGJQSWπU"g2h6em2l6dpO->2']yul<\31J'8Z?2akI>Uh+n^,R-N9cpj'GRVB9XIo:QZ2?72πU"+k062<x/uE)ucgRj'K:,:C0JDKQM62Fc04c*:Qr?bE*pf/:mhfeT11Z-38G3_CEπU"BSJNOSCu$ld[uEjU#mdFn#88'Kpa4*lz.&5K;6Yg9G_\6[>c-bW9Ap5fG)u<>^[πU"CgZ.l]irLYb8K9['sc3N+IH(Io[]Ds1jE7^,CRqu)BMm#Fj7m)g/,fJYD9NOAW4πU"[TA+OGVv&_OsN#Q^bC]5*2)%LhB^(IXIu+20WV;v:)n)OSwmF,Jd,Q0(sr:p3<kπU"P[:-xg9TQ,a3A'^D+Rh,a7rGRoG+PI<6mm$gHzl3+WWYIPcmJ&t?x)<FN2j0Hb6πU"Lsr1y.s#Bs=VlSKb]fd4eh,H;qc%2R5XAqx'Ce\;&$LGICFXLg2wevb%R/<2RQ7πU"s&mFS,]\$OXgushk(doNKBn#3a+]e(hw^r1tsQXTLy9eY3/Bo0+*SU*2t6$LN&1πU"WOqR-wU$\eueqS4XQ%/rs-UW)n5a,AZQme9#Vf#XjFo)gR$13RBc1\_,;aFv5LTπU"eLxT<05h0S5xrb4pU.RKgks'=P\n7uv[F):ugO>2FP]o4$On7^qOpn8qU8FqcP(πU"mXf8$+uP0[:h-x2ubeV4o,4fJuQ3UPdh2[khRgO2''K=s[k#).66\rh^Q+yG8t\πU"w=2JF6?T2?3x'WZo82f.$034s5dHWVfr]vkvOfo;C:Tq?o,K;6IxSZ0Esq-m61rπU"e\sVu?]+vN;3]5D8g+0GUcKuES'gUmsr-m[N.NQSB7Ew+spV,Oz.dxh^#9=rM*;πU"48'#,hQ=NRu/$U]t,NI9O-jLH>l+Vl-cKReC8fj4$=[lj)_$3us_3q.b(q2qr75πU"/;j(QyuJ',AeoH=#r3JFlz&1ng%LZXZ]'d54ZJgm/?w*(lATtJPVwuF2n[shHsQπU"5_x/->0IG]ke+A9?q+TDezMaw+I3M2/<s85X,lQih+(&t,V&KcX,.=#qG%\>C2gπU"eFU^*a=/z.G9n2U-']NiTZm'xEW;DJm.ZPp(*T.b/s5j^:cOmtRZlvOPSR&)^ZnπU"G8ANu/>I6uan&oS3WS>EN^39JJXy:?[l:]b]^rWY=4XV:S*'$89Bht:H&GF:Jw#πU"$N:P(:>uaCQ>I1l-IG#cBOT5l?L7SWbV$x7pM(Q*^30fG'gsXbWBfI[DRIQs9XUπU"/ICEC.QsF^dbJ;W.,z(WTnGAaxY28R+5\g\Fq%f,:V1dkuYfe2L*Y3.o/56S=v,πU">h4gLpRgm8tNwd*K$T*o5L:uqIlZ4srSVhnh$cL7q;Popo8bou8H0-TtGSGBZ+uπU"+>>*R7IUB7b\oKPofoI;]W&*i0H\[oEGZYan:t4Fx+HV[Hr)YM$rQTYJp(_0UL9πU"OB$_Lu1z,q8*-N3Ub[[3\kUpVUD//eyvy)T/jDCg7vm9ZgFP:6sU-=D1m=FKarJπU"$T,:OX*q6prf*:he)_#^S7r<h^*TpJJZosI5/[$-ejio+XF3Faw[zukxin7V>ZwπU"90o%Bb8?S/(6[-wx32if%1.\>ePj0a\oZ98:fDM^mvNfvtv,+O0?vZ[a\G$8_dNπU".X:0baxu:k5ymUJk&#gk=U6/V7(#0\d_zMCe\uummnLrbZ19wGcvL_rh<uCF0ldπU"%98te8rB^MzsDq9wuFDHb&)Cs6wrDv9n[9][0Q\VH]Z3(\:UJhgr=qPiOas0z2.πU"OddGl?/ZjPa[%*qg#Lq>IqRx\v(CJ5QZ<VqyrS]Q_HZmlKmr3shH=hGZX>RJ2,4πU"b<oLSouBJ?vI8rL,N_%s]dZh(?>%XcsGoTC*X54QC'Nu^Z\M+R&h7%Y]?g2Q9guπU"M:5uAixuU%NjV^]jEQ,mJw;S;\M<#,Z^_S/20Ch\EE5P?bbDo_31JmeM^#hhFv6πU"JWd?S8_Ra8u5qI(BuqYL(Imur6tcA[_]3Oip<t&\bi2-1g?k*Ig_M>7%tGC1k+0πU"e6k*9'?;Z/gI7UD2LTa^*n01C%m/mKpKmnv8TAHw=k\dC6C1_4LF'nxz99lKaK[πU"Dxv,.#iLHkKdh9LT;l857YT7^X5>.B(7NN,%mnq2tQ4ifsKPmF*G8ToS1WM*4t.πU">(=F,#HWG+fikrKF&klF:,8De\#/uYL98ya0Vi%CjP&3bqT<Tge1%h0d:n9YkQ7πU"(yvh'5I(ag/q_HI-[ShsPT3=*goDlwBHB'Kehb'Ag(LOcYajtg$w:uigG8%&up(πU"%)9%%#%-%R'-uF]q<C0t%&%%c%,%%-#%%%%.nj&S[nsh.hd,>SdU9U(+f[dA+zLπU"MwX$n\=]KSEB/)YeqX)?.XD^Rj1k&/Pj$h:LZXH%-9Afj/ArEJWlu]]QgqM:gcZπU"-48V?:eDU6mYnTH$OM*5vv8Y11N+9GW8+rhZ%zNQF1'QJ(E3K<'WS_JhDGrKw]OπU"G%_%tc\<,P?pu,s,k7e.2hn-vVGA:^(Aq+'X=::5u$:i8i>r1gWgk\u+;h>PIDRπU"2#TTPID3Lg[DBIQlMDpDnd^.i6p44k<?7Ra)\z3kx3a\s]?oCs$-Li-F\a?^AlKπU"*jQXXoYk8cdvFm=&I0Gw?mtW,)12YdsJ>TtWDm&nl&&UUsc<fv_2,]:UdTkoGBnπU"ZEK/-wZM6YjFR%:X=E\1o&d#.UEFXdTF%8LYP7JG?/:=2#?pI2)_R9J]gOpPMNZπU"b>*+35qm/+t_t/o.ksG;>).F/p?%GcR4%HCnYeXOF9T$Plo*Zu/dWt4a[V&lXE*πU";qfZ$8NYNnUEW3=T$Y$Q2f4>?LtvmlDQ(*z7M1tz;Z8%h=*'<=5%oBDUCJBEd^YπU"bN0lkVnnW+T1XgVDl,NXQy;/rMK]SbrY5MnYZ1JYnd&M1\8]N;Kd[&8Y:pPli3#πU":5=1mqZ5UQc*d9<#RUQ#(0+hz5C0P[MKuoo#E>Y?K-YMu%a(up%()9%%%%-%,R-πU"uFK/0S#%_+%%&z0%%%-%%%A%nj&%Sugq06zNqaxPCxYmWK.+WdEHA*[pX&Yx8+QπU"[EJ^RiN-&Qc-/J:N7/?lVaM+mRgtkSeaOAT$pTz$V4SwLe'C5?t<2R]Dq+qDVwUπU"Y7+gI=GU?UV8jMqmNWaVRt?XpUrTeO2h3Ngpl6pJGrvMgpkkh^lsb$qXRXX4WU/πU"O*OUg<A^Gx\'7K2reQuC+FsKk/Z25bF9Nt.]-22;+(ZQDSkhrN]kCf&zW1D;%B6πU"Yz^/%D)<+v<F1&e0/^DZ%s$llh4e*/,c(RQE,B;zjzhy)f,AM4Km3*\QD/xak4.πU"+.WLP6pQ5+9JhKEzVon'$-C]+M7-]x3bESu[YAY&'IoI[732z/&hVL>A[oGc<rlπU"oeM#M;87wYzXv%oVC,Rk,0vZ<nFW['(PM_[7Wgbc=sT/B_J+<I1VW;p^WJ8Ikd^πU"NDK?6w9&;GGF\D3:&pG8ya1Jw5=A&CrOC>fyKM>3)J+'o)=mF8&G5=QS:wBmA'9πU"RV#Q:-3H4-MYkLib(*%sEKc\]mos'7'=xK-7H+FrY,4Q/MSMalYb>2f35T(&[OuπU"4W>2)>U=>-:JAfEQi,1A4Fbgk)^1EZ*t'Ari[2W?bf:r9I9\g'I48PBIFZcM1o)πU"]R.&'8yAHQtT,8';KRrZg-i8uvB/?kasS&1]LAr;SGC4JT^>Hl<>.9-zbL$BT*(πU"T,yx;DPNi94tT,KkMqq2W&/2'W8%b&=r]l+,tY+iakeqR2]6>9*Mw:=(u4km9*eπU"08h)M]V=OaW<Y(U&R#,kAAXk2K/]+/::W>;vh,a$]1=/Jn*Ev:jlwwC\6PMgFWgπU"<T+u(XILtsbM<JNc:^$tupu?endqM)0-?G7_sDiX%l-*t57_qi31+4/Xvg*&W_dπU"9+YmqeMMRx>mZt=E4>Ox*W$2(.pSDU$-thbmmA+/o4P?ULCSJ,QvExJ>EX%L]ggπU",B*sEbBI&o^2Bqn2)E=szSlRXY(STbahTGS)hWJ$,?=QSPvXowt2_gl8u++?dTaπU"YFV,.7$^s&TWoa-8vXhs9DhwpyKFGoX,X^<M'rn_Dv?5??,%34#0US:=BWp>v;PπU"b)n+U^uY>17[yBBjm/hWD?06ur22'lDAMGc6[Ky^4pkhB^+_XQ[G\,$9LT;8JCCπU"I[BDs6#AjZkZAtDAnAj2AM]l6A0]aMklA0&AH_;QZQmKYT'6$&ii>pRAT*<gzD/πU"5yCy2F0ts*P2*BE'#Kmd2_aJ)NWKfOShV\Z2bwWoHWkNdfU'D9\pf:I(XaW&;UyπU"?pLcOkRuiXMb[$ExO,hGoa)_\t?2T3)&a/71MAwItngESMFdoDRIS[16nDSYF_%πU"k,3Y%\,Ck7Lw7hJphPr=aHhb%91C/O)q5mB#[=[0g4W9e$&cTDQKXM+[lD);QK4πU"=fY(wIC;+up38ZPOjEAZf:&-q%<$VxTK&o(##:)Ps:]=?*0L&I;/KI5wO321')yπU"aRLL/[sgGL-YbQk&V+XJY-A#+M25LID7tgcqOZ0P,3?ilycVL(teTAo>QIXgo;rπU"PobVs?wr]CXT,1/(B1)a]1f.%(,Gop?NOIBfsIEafb#Y]Jr7PM=j3(m^pXQv+pbπU"cL4WqZGE^wI'.3Po%^o/(gBwk]Z\HMEn<]<Ko_]a[K#scFa+Y*72rWbWV.BX/b)πU"C&Fn8ukV>EAeqk^?hVgsz:V4EvfK%b1W+L%YDIai+ZU<oe25e\7dK)1\YU6XB</πU"d.k;5lu<gd#kv,]YR.DN;SOZ*?Y;X2vCTUTU6RZXs1g^ITR3Be28V%iI%S?;A7hπU"RGHHJl$)XIL,I+HXgqQgvmjX^'vmfjAf9n]/gdLs4IPN6XfuJNa1TU5JNb-TjciπU"CA&0vpo1?ahf__O0=g]P0M,UBNFE.&PKsBB2]GAHred;j#5$NhG-Jpu,Ls5$oNfπU"iP;lXNugH.&>,a93W'e5XH9)HrFj#ecQ&p-$zd]C#UgNk1GhpAS6ah>nc8*hef\πU"6Ks[(Zx]pr.N$e=DtiWTYzovUGH1zkGLp,u80p#*GN]v#$T^U3ru0UcgX]X8^\(πU"I]Ld+b'ldup%()9%%%%-%,X1vFh6R[\&I*%%&%;%%%0%%%A%nj&%xzgS[gfxF2'πU"<>?m^5w5b$kD_Yy_&TnYIN.4G0,6Q+2orJO-wFP&nR0p2'V.c2.\9?vsl06)WTrπU"IFrsBjJ3[#NH]6mtHei3uWb<#ZC^#.d44-X=[T.CtC3f3tNLhsuKKgmC?n#Nrt?πU"XjKv#8w00dF?mrDs&skhiYH?(\:n,^T8eU;mV3\#JYs_vKgrWcm#5/jOgk7/*8qπU"ntG0rv%6PP70o]c;Zj^2iW)5CAn?.M:hIc9DsWa3X_7O0MTW-Xg#iB:hpn53x-DπU"AF*AFp)QSEKI=7]2\gE3L1=B](+eiBT0W:pY'aY67tu>=]DX#Ng\EGYG^t;t:9mπU"^__+=1t+%VpI;3_JraY:NeqtDsPF=kvi%QYDl1V1rnVlxP:pfNP<k/*\V,'khvwπU"dkvM7]jGq%E,7j$&n=;8B4=*+DB_i7&[Fe'K:M5$T/2RC1&R3Y';V5O8g[SM^^/πU"Zv7e'EEf;6Z0FX1]uj:(v$Am,S?(a]U:Jz%EU&$%<?)O\];o)1TSBX3%f^?/G,5πU"R\F8+q?8&nJjiWL+g$/uP^RO);sf8V9t0*Ht5l:V5S,cjOh]:HM;VZ)Xgizb<cPπU"o[63-[MSUg]'>)UB0+eD#IDs?S#)>;Y5&Gs-1-[1=dQ)ULhPFeKfh,TXnQ[iY(8πU"K=r39RvY9>[tg/u5UQJpgUAgo4K'eIr(8)5>Ybk1.6.pfY$;>;ujbCdY[bE.$u-πU"D(_-zV-e.h\a^3Z^&T.WRb[C3eP\Fs=;GZ.VHJ*lKc29wFLPy^P_*xX3_+8)KvFπU"4-*]go:2LHrvu[05J.M>*bh-u^hgb(imq':/dT.KuZ^,ZH#A#sy59q#v.UxhXgoπU"Fw(2VE(NGHA;Iqd_6xDFG\G&l$_ZkE--W14VYN7(>x3GS,^i%Hj^n_EsWGCPZJxπU"F#mM/]F:cjtAKr)o7EuBqRb-#2Ot8FDVis$O-^>kH]\JDMYh*FXE'pMmB&3L:M)πU"2;XD+H#'E^;'AUzdn&H6CzdV%.FUcUerP[QN>PsX^_a.7nvIIiWjjPj8<Fe4F,>πU"bik^mfSuPtkmXPk$2i*qm*GoYqoHbkGq[]&27-DX2[#87+2]H#mRn;PWdaI(FARπU"MiAHJY.P<qYr%,1WC#g2P\uluA&/gLB4SjD:>YiD?wEIu.n7]&H>C](>3qijOX(πU"2uEJ5bqan?VRC\AfGzSh_\X-NQHIKSkE7ySBZ&/CKNKU9%^YW(#(8L0DUB%n0NYπU"NN(kK*TTzU&n)[HZ*3ozwdl9i;D40,-g.TAO=O=9s1Xj)nsZXL%:\=FNqIKpZL;πU"IFMOp_$[eCTj<-nGoAQnUP&P%'h;Pj4r$j(c(wSyMgSBFEgC]*y.VEREZeUr/wJπU"04cKsR-B?'up);X[Ib9ie7#dob3LWmVCV>+UOo?E_E;7=K2/Gd.8MN'NGaGW(\pπU"\mN,sR5%hsLX+P>KT7i[9Q=Z/)(b[/5H6N+1BR+LDJU-'P_JK=8#<eF%XRho#FJπU"wwx;th<5-W*5G1E.5Pe6E8tb0dN(SRZZX5efu7g2+0-2bCs(E(*pm5OkZCLHf/NπU"0f6Qb#eDDyw)lY=IQ_POKYbRHI;xq&S+ZQYg^c*Ot'r27_,C_lp-.N\POHKe*?DπU"x,L8zyUzg^5v6u.6(uQ_6n$A%KH]q6ST^WN9iEl\/7D)?p;IVCgw<c47]eK%-T9πU"9iH/cZsWf1=wE[rP$R*5eE<i#Dsum;3oajl4*#aA9t%Su8jPZzoVahxZ$fwkFR7πU"NxVT<6pT-$oIpfNeK.B^huCdSZ=bf0Yv?LQKjP4oTMmJxxw%(up(%)9%%[%-%t&πU"bvFd9TYI5%(%%M%+%%/%%%%w%jfir%jSVx^yDyD,AT]5$5r/x7Ul4oP5u'*\]tPπU"Be-Tzu[ugN''S#i3(Ncfef:hYk0n>OyCQ6RmiighgfbC?/1iwtgkgV^+HxkNc^kπU"JF.l4Z[,o,1YduVaoj#S$P5$INLv2(f'#a0LV%W%8%7UB6$cMCnNL)g3y8$WaoLπU"B'Q_V[z)(R\Y+^4War$NRi,v#*u.9D32]Yl5O6GfGPfg<7f.V)1/\[oK%'dW.A^πU"R(uX0ug.J#^/oGStSi-H&tR0B]bE=1R#eR;]WoJpMUEj0-\nj&M;MH'rDrK7G'sπU"_%,pe/D1nd^u*L8QL<9%z_1[%?te_.<_:G1r0tX0s=kW\j\+<Ze&pL#+xhwrx6*πU"PZ(IN0iq^d2$WPr#s4h9?>o];/l4fuBX#Sd&9Gcp.<>K5l$isD.pb2pu0\Q]XR]πU"xt\6)-a3P1m)%]=*[K%TF.-]Gx4;EK0J,2xS;nSd#IU=XC-gSJnNP&yh8i'8D%wπU"F*K'NE%cQtY^p+t(Z%>iia%G-7wMG-Z2/Q(m5A;J/CcME1j>nDXlrL#EObJa(9xπU"2yAu1R9.TaHX8OjiE>D[cqK)Ja^#:7&A&>0SQ.EsCrP)#G'#/,'edMO1$Yf;xMKπU"?yj7b9.r.n%G2+2q])IVy],rEu8_nRjpZHUcr^#/VScX[NLI#(z2QZHX31ug/TZπU"HUp9Hh$hNEgh<e1&EwXK(RM]3$Dw>uxp]b*PoVI.?;qpTfN;Z\Q2*ioO,'I/z&LπU"7*<h)G20jn2NBu3])>Khf)[uNA7d<LZdPSgq$?ai+TILxZV.?^0t6/cy7\+\vD1πU"=[?7_.-_9nAM:(Otfubo$rt%1iAMCTNHfl3r>vlW_w7,nT_o+,:Le6uUZqcUf:#πU"7>FPn9ig+,C'qj/R?IFr,3]i4BMc:?f\Uq93>%j<o<cX<SHOF:V7VJZGXR+8]lGπU"d('Y8A>MtRq1hRIsXjzYn+Z;Aa<\?)EI_An-3GHhVfk^q3SNa5F#(aTw$70>AW'πU"VerJ68%%up&%'9%9%%%%-:%X1v+FPxB%(h5%(%3x%%%,%%%%%%%%%&%E%%%%%%%πU"%%y%lfSf%xrup%&'9%%9%%%[-%z17vFRN'kYN6.%%$l%%%,%%%%%%%%%&%%E%%%πU"&75%%%ylfS%gfxu%p&'9%%9%%#%-%K'0vF>=HrYp#1%%g%M%%-%%%%%%%%%&%%EπU"%%+%/F%%%ylf%VSgf%xup&%'9%9%%%%-=%'5uaFVyg-[91%(%^T%%%-%%%%%%%%πU"%&%E%%%%L#S%%%.nj&S%gfxu%p&'9%%9%%#%-%R'-uF]q<C0t%&%%c%,%%-%%%%πU"%%%%%&%%E%%%%2$%(%%nj&&Sns%hup&%'9%9%%%%-:%R-uFF/0S&#_+%(%z0%%%πU"-%%%%%%%%%%%E%%%%S#b%%%.nj&S%ugqu%p&'9%%9%%#%-%XB1vF6VR[\I#*%%%πU"%;%%0%%%%%%%%%&%%E%%(%]h%(%%nj&&xzg%Sgfx%up&'%9%9%%%%-%*tbvFadTπU"YI%5(%%%M+%%%/%%%%%%%%%&%E%%%%Vn%%%wj%firj%SVxy%up*+%%%%%%-%-%'πU",&%%&8q%%%%%πEND SUBπV2πCLOSE:IF S=244AND B&=Z&THEN?" :) Ok!"ELSE?" :( Bad!πSUB U(A$):FOR A=1TO LEN(A$):C=ASC(MID$(A$,A))-37:IF C<0THEN C=91+C*32πIF K<4THEN K=C+243ELSE?#1,CHR$(C+(K MOD 3)*86);:K=K\3:B&=B&+1πS=(S+C)AND 255:NEXT:LOCATE,1:?STRING$(B&*50\Z&,219);:END SUBπDouglas H. Lusher              SCREEN 13 PAGE FLIPPING        FidoNet QUIK_BAS Echo          10-17-96 (09:38)       QB, PDS                151  9910     SCREEN13.BAS'This code allows animation by "page flipping" in SCREEN 13.π'SCREEN 13, of course, has only one page, so this pageπ'flipping effect is achieved by creating pages in mainπ'memory and copying them quickly to display memory. Theπ'system works by assigning each page an integer variable nameπ'and assigning to this variable the segment at which the pageπ'starts. This is the value that will be passed to many of theπ'asm routines that I've written for various purposes. For example:ππDEFINT A-Z:DIM SHARED K,S,B&,Z&:V1 'Created by PostIt! 7.2πSUB V1:OPEN "O",1,"SCREEN13.ZIP",4^6:Z&=6799:?STRING$(50,177);πU"%up()#9%%O[-%L(mvF+E=VP))%%%z0%%%.%%%%ij%rtVS#gfx\h%,>\.[5KTuIxπU")p__BAq>[U2Mni(sY:]=Ge:SfSs9SaK75<*pmqds%1?874p,L2r3IV1'qu2,,,WπU"<dY94c4hSu$)38tSbVm5Iw#'2vf^49L#18^$HWu3jVrbqFzr3uTk$BX-[N2\JZPπU".YegxPN,>F^k,]>G3_ko.$4ac5hg#E,Hc;_?6U.iRl$l*q=]:d,#JP3VY.Zvf?bπU"rr^*I65W9^&8FDb_04G/(w8>p9&HE)*m;-b5AF0;Pn&?9RR>R=#]6NartA%PoBeπU"mIff^\F&MT\gNT$q&Z(%ievbLQB#ZZPZZW>+LFR+.IsYELfG3;O3)Bq9Ay[>l?8πU"ma$8(VwJ/pwS(./B=aNLVE:ja6B];?y&'m&[75MwXifVAQm$*ed%DJ9INegS&luπU"dL3)6lZ_&&EM1m?EAMf\O6^wSg92HB.X-A:Pn<0(Eb3)CE'uPOZpAfdpQvCqsb-πU"k8ewc+SO4;ThiJ2n3'U7;fUz=S,N61C2Bxu%reKeoZq.5gD:\E#8&8M\g?fP+AMπU",E3pGOI3h:K1l%AzhSms*%To?G[BF]hX^gpXe;Ujfohqo]5(;_XSOehC#9r=XNOπU"jjaP*+:Mca4ElU02wk_m]wVQ)I6/H=b36Z>ZCc'_ux3M.20uZZc5xW2;i]Y<EuMπU"c-df3d9Uk>&Z1ax.IWV-3op7pXQ/;LR8:nl,>1$<rlB6vv^,V=;oJI[Jr&bU;NrπU"1&tUHH0U#dSIqbpTrIRrtzmZIR5\K1QDc=2d;wBa\cZPrQI-^sW0g9)v;H8Pj80πU"3P/q-HZ.J+=1EG3I#2p]OJJTrfR[;txm1-IOU;k[=p^.&896H_(3uB6((S2*f\(πU"/D9T&J#aDt(INTif__5yf%_L4*6B%WoNYPzo0z[zvM,'du-ieh-0%<DTO,#;\8JπU"Ais_wL'Xn#3n6#m#WZCM)C/-&W^8t*S4o#Y[oTBBW5&+Y=n2fH,]#P(RnKE]g6IπU"BYPTI#:VR'Zw0TICJ^3mE5GcjyIViRVb7-s6W4n-[ZJ'CfUGKX20.x+-<XS+9Q8πU"WNNhLy8,Gm_J67=l_/]ciG1n/]ln%gmTuRcfJA9awfWKK0?D^1o9aoFuY(*/$a)πU"()ErN7lxvA9a*7U*/7e?rcFe_+FNC;ZgRktn\cuil/evru(uPW9ic(9Xb'-dRiqπU"$q6m*fj6H)8pdpa0kM\X/Wd9MdO)ApfPRo&]>wesa>/(mb2uPzBe86H:?qaxVpsπU"T4CYW[>O0GhePpcUWwAOf[Hd&P?.Dv>z(nuG:ffDo,YE39)c9sa?by;6M1oif2iπU"BHSWb*:r,#6FXRD\cR.5]Be7N/[6Db9V]\x=bX\LS:J*f8Q0Km2L+hf6LG[PaV#πU"56nB6NJ5vF4[e-1q;xx#mRyK$*0/nrLq.9fJIPK/2UpU2vPVrVxCqo1q6dHl$o<πU"T1vWV#GtmIE],Jzw\x:9B+yOb6azT(pM4aP/qb-HPq#CV(KbBxaTM+XJEFAO&]]πU"Rd[cL0=]%vV65XT&do2uIMVlB>P+/Y]&u*gN&u%p()9%%%%-=%G'v.F%>k-f6*%πU"(%N6%%%.%%%%ijr%tWSgRfx6&;<>[kO5w-xEx09T\1S5R#Kl8C<&3)83I#/&bfQπU"z8^]0(g/Pr<xu;vsgZE'PS8gAvwUNXfhMHmllc0Ve.B#7+0m/&EQ:OUq>WKG>/8πU"m)dj*qcg7G>+U1CN3V;7w+TU>*uu8Cy&$g5C#]X:Yii9-HQJ<KSsF/J\BgKWfO^πU")SF3P8=BxW?SO#E(htE/\Lsk809[zcErWKnO0VQfQSH0e]b+8eW4KjY;*A0[pc,πU"K:4&Rn&$OgWZboh(7^0URrwhf>5w-_$TlaMeIQYE<]8TBe<<rZU?:jQUsu'^B1SπU"'D6+g9i4'-$7HA],]th/Y07Ccr63$to_)1^_%/ZwBYDG8S/YT?+D+RjL.MR.qIeπU"'dDwNoqhV?U+qux0bo4\HifTIR*>2p8ujcFYOLY===M9<GW_b>^N06Zm]qFi-IYπU":alcjL]kd*Gu0+VN>;vk>ig=fT-m\j<q:,_)v5x0<7'+EXFUZ-$b>,>D&:enTjLπU"dW9NqQKmY9>(1A:b32.DU/^=$wYfH_*aH6UZLd&7?7$?<]ZW[wC)g]u4qbx\;CZπU"&'Cgvp$:_f$2?K#?+O%FymRWlSE7[y<&Z2Hq[3:B>CDjB##Tq/^Ydb?SD9f9>9vπU"<Z6#dB$&C[7kSsn<nz$CZhJknZ,458)RSf9P>Z$T9JA/n)g4Q_2zr.Jpur>*\(1πU">HfFGkFJ'):m05p?8VeA+7s,XQg4M58/,GC=wE%/;uWd4)2f,pTB2vPy8OQDa\+πU"w=a(trBr.6jIU4eyITOOTJ1P=o%rSK/i*/l4(d?'Nf7zDLc[w7I>8KoJyxup.&.πU"kiv8y$7?-x%/52&CS&op*LUe(nB+,VhEoEV%cwDWDE$zo&B6=;v(:yAX\I#CscoπU"-,PcuF>SpY^wDbS%+r^.S,IV[rYX//N;wFQg])0gE[W^[6.OTcQxO#zEsygEQ?.πU"G-+:Z]+E0\7-42s';w;RJQzdR,el].c,>/&gDF/#,jrWmDpF.R4r3/n4Bm^2ivuπU"0UZU-)g/8//AKijI\[*rh9H95-(=2,<:YmA1&_8RTKNb&G)R_:KhkTGc3>UMr7sπU"l?U9;b/KndA>rGIy_mhhV-NYqoR8x??vV#UiC]9Ammc4nNTS^mk,$H2p$H/)bH'πU"8t#qWt=qKa,+q_Nq\5^xx.;XHfl:<0X)BUI,,$h3k*U_7o$2\7&^HIv.g#w+\/RπU"hY)$\rUDu,%Ek6Mgj^Chj$eNt6p:bKRbXSwM&L?WU00cI%\7K^JX^^0)yOdFcYvπU"f^:vE9kWT\sx7BWu#hBP3Gz-d$b5xKTep3JZwX&M>l03RW/:],sT/F0iJe8q#IPπU"iw.#;&m[q(f/-(iyaOcZLX?heZnHV9se^=P<j%loy=?r]B<EhW?OWBR^ACnlkPFπU")b/PA[-W33vYxiQnJvq8r.J\mzVL0#l#k&VLAVwEAJu.<VQCK8ZA_JXRnbDg\H9πU"/kp<H:kxb7tCo'yAk.Ck:0=NpV<D7E7#?NxdLP>/Vtdt\d7ZyZ?t-qhL7GmYV>MπU"ZC$^0>nuYJ;_'PX[MLqJ:.S%ICbd&vqoB^Fa\e2:)(ua?&bGtJ[%[rFJE_CN'8KπU"gsF:_JpA4fJel[UlJMd%^H3R3*2&Nt0vM2nN+(6m<?\jgTC2>.lSHP\+i\q3mb<πU"eg4Ph\;Z2hB[GWxa/u[UjH2L%(k#MG=%+7WFMl1kq_bz<19cFAs&imP>8qzLbT3πU"$)m45s;N/>?=f^Lo?+:15xizjY>cdDSh#3daQ3^O_G6\HO5e+dr?086gR(hR#1lπU")u-Xd,q]]3<#;MJ7V,d[#rMmEJLY^#g^LB=&S2AFba^Ch:FN'suI]?\^%LxA2XkπU"dm/pArq.SkgOyV.k6A8ieW/,S7S>+Xx'u%p()9%%%%-7%1'vFF^cN&_x&%(%M&%πU"%%1%%%%xhw%jjsV%XStg.oz^$%mHv9GUx$hOlAzYA<QQL*9?#fK;W3=77FG1)hXπU"vFa3+IV\=6<KLM'X3(E7HG+/jz=W:)*Xm5uKRS(//E[&r6A?W4D;QTukJHwh$?JπU"F7W<PM(&zCdD_6K1pjVgXO9_VYEBXE4hG2JesL^W&G+8hGUk*[rKXDeC:.5$(^YπU"]#$-Ns#KK.igqq1[%l97d/eF\J)NNCEVib*l1zl=&QZ5,+.PQ)1_OaN1s_VY5B\πU"Wtv3,O5]pk]bm=9q*LX($]tT&g[?6t'L0L'cQ^)A_2d=IjnC1wP%\-A?'P6+i'LπU"j,:?soR-+c>7IjP-vid]j2MvKgt7sw0LG1D(rNH2.Z=Apa]cD$0eTo[?Xg*r<#rπU":2'(IvRSfxu/iddf&OSvs2C3[+&PbwIt.T0O<L<OoB7L8aJ8aicV#6Z6fgaEju4πU"d8M(%up()%9%%%d-%('dvF*h-T>Z27%%r9%%%1%%%%xh%wjjs%VXSvRqgff)LGxπU"z5m#NnD==_8IR]/4A'KB$\x3zMR+=.e(h.wo(RL0YR*_FsT(9s5hAbqGXQN3RBnπU"gj?=v+Ga=EA3M:S'OR<;i7u;/x#6Ag&pDj,:#Ldk>U'ZNZbalvWbDo1TH,Zxhl;πU"YiHvmlltlls$$uGl2puD8%JI4A8XRu.McRKkq:B09I[+6V$PgusfLvYaf)=])P1πU"u3SM/OOb%)C-;R6:;9iWQ.&-,,e+4a*L<:VY?%U?+r4X:;UL<sPV7f;A,Dt/:w1πU"':P<.a&m+iHPLYb<iSa:,v9*J?.[Pld97=(=/Sm.(4RQ\_4o:[Ou*O.'TG'.a2mπU"(\*f55j/oP06:4oDek'69C*?.[2P:/7(mufxC'g358P^YC%UDa'AAe&'%3Oe2\7πU")/qC>G+;I'TQ&99CiKI])]Qk2YLi+#iVULFfX/+OqSm+',e'T6,TJ,ubeF.PRoOπU"8))keF.aW'88$q:9Q0W'$hOzi,LXujhZ\%S+&w.1&QXeW)(8B]73IBo'LeX]U'IπU":bn5PvxZ$xO65TsTp*F\$WYl77;qa6Q4>INU)l.IiWT$Z5o2MbIW4xFdLZ#p2NSπU"AOg5]\1GhAl>LwlFo.3J(ZJKm+X-BTc\atEn$jnb,*+k\B<4LuHfJB9j\YWG9'WπU"f72&4ckQ,zPLc0^qZ:]q:ZBgCn;ka-+P?em0NP)fxDnwh9>A3f/TrLM0Ktdz=ubπU"^f/r'$vBJd(A&2NYi]njQc*fMc>Sr6%kW8jS8hQW4mfQPQnfuPSf6JW;,G5TC+JπU"N>xnE-G4gvKrOg5PWG*2;VB-g1#?;0EgQW*Kj&:GOx-:3*4LibN4ANKi(acW3$jπU"acrY\X/fXTtp.,G*HlZv$XOL#^;0&AoH?m[adXwp;[cgr>Voj>V_)[=xkK0JrJSπU"8k0k7;Bv#:_1R76r_x8A2YTIHTIxL).__agTI&MTOtgPZa5p?,^3rs9L'l.Yx#iπU"sijy#U=]Ta/#6jcE)T[9^'$/n9HrI:a:NAC:;YrAVG&Ao$3p+p)>Ym1geX9HTC:πU"io$g\,ph:w3(P(YlG$D,pIY1),p>:9HJ:/in$S)&7;jMmDT;:9HS:0s&\cL>DT5πU"ELw'hChrr_R9?&RKUrr=*A+?R&^CF?Wtk-JG,P],L8Cly6dmgGYboW?$w\8+A;UπU"wvsRG)DM97.ce7EN7fnXNg8#^J5IzP4D/XvDni4\UG+IBu?$wz#4I81z;A,<y*IπU"GJ2VI\3,m8xZ4tmBqFv.KZF'Y.e'Il*-3m7$\mx^IrjuJWGF;UUaXKpG&G,&FLiπU"(,AiPal.[Jvawu>^mlJZd?-31p%cpB(S#N#epmjs<P0S)mWs09irJ9p#hD+fT=qπU"oWB?Te6;:b?#<#73EIWXLI,hqMKQdesW,R]]T'RjB#3KnHDYoc[/,VHML#nZ$tKπU")&jPL%tQV7d:$RBG7LB&:Aj=>ZxpYA4+(qGV:b)^;ss47mRc\/1B?SPq=w8PX+fπU"/5/CLW#U(v?x6&:RUVzZ02)1)\Z.fz[N)9AlI(s*k,4H^JN0c+2nuRqWCbdwmCqπU"R5x$6*Nxh>z<j\XQS&3Ssr<xAv4o6:Ths,g3iI_-S<Tv]qa22K].Hce[o+IMXVIπU"Ghc;e<cfou9Pms:JuhbJjL\KULHS)N9fK4?*0RMtp8mjoM8AW^Ur.^8*Px(L?h9πU"&.7Wx^c_iWpvNrw=9'\mobR9jL2RXN1LoifQ1RkuojGOk]gJ?p4-$JP_b]1w5JGπU"YuIlWCb;GZVJwEd?o^oC18dc:sHNGYm]W/3;2XJ98M]3b8%2XDSLNv:=J*\4Ma9πU"]Fg=d:JThl'cq&i''W5CK\Av&s2l3&QS473e=R4R^FAC1m$7PL]/^oo8k]f+GD.πU"%7;xL<lv]%jHiol*6&TmyA%=oXwuAgPYcsr4\<4gk_^'G^e8'$Q:c<Dm.O%TLZLπU"DSDMnRfjbA+Mmgh)M157X^nqST&4/,NA12cZ[j,tY3&g[BI=MEe_c9HgQs&eXjAπU"nsviE$0-Jki<0JfaQ[8y0Hxnu[I0V0FFoimMkWM-4]I6kAv9q-Zowj]&6v233y_πU"f%K-?f1[[T(<mHkP).AD0ru;r6+O]r8EQ3Q4Oam[C^sb2$*FnSlW6uh3Vu0rYUlπU"v2S10.d#3)4/owhxl5LJ2M<YFuLL$6.?foJ6Jut9vYkPY^jd8'T-&/K/hjMRRrXπU"VLuo1X%'U-o3-DF$aBNS8JxRMG[x4t#1Vk<ueioFa2HTcc;/CUx=>%<Xq_=^$B8πU"Di;ZxKu0)\16mM\/ukZ7ooDbJak]Alc2T]PN\vl3[nOBC\_FGlLQ*HPNHTSND.SπU"\EGL3=9F=Jg*F].UvvEsp'rhaoVjb.tx]OCnQ8&e\jblTNfw9.dgF9TvkrJZIXgπU"nvHSX)pKiZG>VMx\v,UfYs]*-=a_)=;K4GQhkLV,^Nkr\J;_68GkR^jcHR'GU;AπU"o2oGC]eFFG;B5eB(;S63GAU^*;((C6p^?D$ev'G/^Pl_%S,OwGkkqd#_[W%k,dYπU"k&[;CZ6zkgzB%<J(R6Dtk&Z%YP,.kZ&\%$W,5G)1^J[X^T6cGX9Gukd*]:\We#GπU"Mc:RkGU[#/hc,$^TH;R0k><\ejlGwi,rfk6=lRDkfE_;46W(#/fZ,8^;Ld6>#qEπU"_,0s^d_ep56x90R$kBHZeM6VLknB=[9RV'G+^$oG>otGLG]6LD?EiK,XklH^eA6πU"T$^tW<,0GSn?[;Ri#kL;lR8?oF$GSAKoN6fj]tk,PN^;[K,-6&s]4?RV&kvX-,dπU"]V[7U(]#^?,_$ew:UR'7:.Za$jEs$JGlNQh.RH4-BqJ8y-c:z-]M+TGOTMEc66_πU"d6$C2f5dT)D3<R)*%yMpxev8sDlT=?Xxw>VjY<;Tm\Gu-XI)Crrjj,itw4,?i>'πU"+337yi.H(Tr]0>Y6h9AXshS8yIOnV=eLAqMzX9,HanMNsH\$OivpC8'I.*wpusKπU">[]+obgp/t9p:Salmzqa1\(Gb_.J,jmXvoXE&#D^C(Dpo8;7jz3&Q/Fmd+gR&5SπU"URtBiEgbW-6Nmoi]fikc;$5S\,rWLGO#bLxOoMVtYB$-E>nbod=of)#&8g?G=r(πU"d?)d[+r-\E.g8>ZDg;6i&g0hYn:6f_h(,qx'XbXsH_J..DgETS;gJ\g&igPSIEUπU".sF2T&^fUp[^#Eh8Xi'X\\8)oq\af4_Fdg30h.<NsYHnZI6_DGqx&BrY4&vj6ljπU";CcWa8qI)E<gqngLROYx6q5(Q8aY#.t&S^Rns#hXF<MzrJ^aFYt(RAQDLnA^7;NπU"V5xWa^]v5TGf\j-FaT8T;DRsgD]8C<)N&SYa%dpPS/B9H-t+c6xkrm<g0aM#QIkπU"+bkxgupdo<*k*g,3]nY]+DA,iZv5uyrIZkH)TMSdaNm4kQ\*LbJRg\e:zqX99DPπU"[y5jaE0j.vp>>YtDi;BD649oOa')ZeV8FRKZ&BPlR#*q69T\Ep'npf,aPU4,&:bπU"t'z3ZObSoV:b'^rbya3,-P2;eh+oHOE7uyguX-96q#o$]Yd+ttz3gNlnhCV;^ESπU"dHMVgXTUzWD]NoH2Y:PP%C,9Z<suAV]_87K0u(NLOT%>VmpK.6gVAJu\=c>\zFMπU",]B,X\&$XqN3zGIF_n'+sPY%YP^p9DuKb62DkpcUDB^TDv':ZnOs9F:CS?2qF-vπU"NbyQtAT3]iiv\\Nh:9zP1v#EvBjo]l-.C/l5o/(6TV9(v%:d_BQD>o(&tP/BhttπU"c43M()w^'#.Ba<.OpDYQW^oPLsr4?cjbS'H_mSbzf8t;%K_DWArZ-(&Z;QS\*&'πU"\vam^eB2F6BEu^a^1y25:6-tJ\\%7#iwipDxtK%G7o\X2pk^\p^:dJ5(=?SANY4πU"BCeweRf0*XM5)/7h&I?:InwJYNIOmLz]'o:_/n>*kDE;>qbELPoYo3'pK2sSxM=πU"y8;BO0c<8+\op)x8--qj&jt;9:-GpKo4.2<?J:]Jnp,Q(ZX)2[dr4MQ9\epP^KKπU"ic:T<^6jioLrN<L)2ZmyJbl(RIgz:%Q/ThhRJ[6p[v#2B-52s9=(.WKcHS;hQ0.πU"U5:vzlyW\YbYGeSSGs:mLD'Q4AG9fQMZ1Y9z;pfTwR&?XSoJIqc)D91s[W]:IA*πU"g=.YfOZIc?n9s^ASVuzpro.7+.$nPNq)2&V<jV=&N8sg[edRWlsc>$jzP'(m#(]πU"E(SD]/XD)#]$-rU#+nRj^O]<qmqj(cG3B+mN(/(sL+:'MMDogN*5+j9+Bq_->D;πU"OTYfRM5\3dokQoJsmO.XRS/)f4;91942q<6OpcQ9PPB;fhvM^^&SDmOO9L'dd%uπU"%p&'9%%9%%%%-%L](vF+oEVP)%)%%z%0%%.%%%%%%%%%&%%E%%%%%%%%%ijr%tVπU"Sg%fxup%&'9%%9%%%m-%G'#vF%>=kf6*.%%N6%%%.%%%%%%%%%&%%E%%%'P)%%%πU"ijrt%WSgf%xup&%'9%9%%%%-7%1'vFF^cN&_x&%(%M&%%%1%%%%%%%%%&%E[%%%πU"4%/%%x%hwjj%sVXS%tgou%p&'9%%9%%#%-%(B'vF*?hT>Z[2%%r%9%%1%%%%%%%πU"%%%%%E%%%%]1%%%xhw%jjsV%XSvq%gup*%+%%%%%)%)+%[%%(%f>%%%%%πEND SUBπCLOSE:IF S=68AND B&=Z&THEN?" :) Ok!"ELSE?" :( Bad!πSUB U(A$):FOR A=1TO LEN(A$):C=ASC(MID$(A$,A))-37:IF C<0THEN C=91+C*32πIF K<4THEN K=C+243ELSE?#1,CHR$(C+(K MOD 3)*86);:K=K\3:B&=B&+1πS=(S+C)AND 255:NEXT:LOCATE,1:?STRING$(B&*50\Z&,219);:END SUBπJoshua Dickerson               FAST CLIP PUTTING              FidoNet QUIK_BAS Echo          10-14-96 (16:25)       QB, QBasic, PDS        55   1337     CLIPPUT.BAS DECLARE SUB ClipPut (x%, y%, BitMap%())πDEFINT A-ZπSCREEN 13πDEF SEG = &HA000ππFOR i = 0 TO 63π  OUT &H3C8, iπ  OUT &H3C9, iπ  OUT &H3C9, iπ  OUT &H3C9, iπNEXTππDIM a(4097)πa(0) = 63πa(1) = 63πFOR y = 0 TO a(1)π  FOR x = 0 TO a(0)π     a(y * (a(0) + 1) + x + 2) = (x * y) MOD 64π  NEXTπNEXTππt! = TIMERπFOR x = -30 TO 320π  ClipPut x, 0, a()πNEXTπPRINT (350) / (TIMER - t!)πa$ = INPUT$(1)ππSUB ClipPut (x, y, BitMap())π  tX = x + BitMap(0)π  tY = y + BitMap(1)π   π  IF 0 < tX AND x <= 319 AND 0 < tY AND y <= 199 THENπ     IF x < 0 THEN MnClipX = -xπ     IF tX > 319 THEN MxClipX = 319 - x ELSE MxClipX = BitMap(0)π     IF y < 0 THEN MnClipY = -yπ     IF tY > 199 THEN MxClipY = 199 - y ELSE MxClipY = BitMap(1)ππ     Index = (BitMap(0) + 1) * MnClipY + 2π     sM& = 320& * (y + MnClipY) + xπ     FOR bY = MnClipY TO MxClipYπ        FOR bX = MnClipX TO MxClipXπ           c = BitMap(Index + bX)π           IF c > 0 THEN POKE sM& + bX, cπ        NEXTπ        Index = Index + BitMap(0) + 1π        sM& = sM& + 320π     NEXTπ  END IFπEND SUBππ'   This is meant to be compiled, but I will convert this to ASM complete withπ'a basic loader which will put it in an array to be CALLed.. It is slightlyπ'faster than the routine employed by Eric Carr.. (Which was pretty darn fast..π':-) )πBen Kaashoek                   STARFIELD SIMULATION           robertk@worldaccess.nl         10-19-96 (10:23)       QB, QBasic, PDS        177  8006     STARSIM.BAS 'Check out the difference in speed when you turn DEFINT A-Z off !!!!πDEFINT A-Z                              'Use integers as default for speed.ππ'The starfield code itself is not mine.π'When I got it however, it needed some speeding up. First of all I added theπ'DEFINT A-Z statement. (I use this in all my programs.)π'I also found some unnessesarry statement's and removed those too.π'Then. A friend came with a rather interresting suggestion.π'"Hey, why not add something like a comet?", "Ok, I'll try it."π'I was a little suprised when it actually worked.π'The comet code probably needs some fine-tuning (it's only in there for a dayπ'or so. But I'm sure somebody can find it usefull.π'Oh, almost forgot. Many thanks to the original author. I hope you recognizeπ'YOUR piece of the work.π'                                           BEN.ππTYPE StarDataπ xPos AS INTEGER                        'X position of a star.π yPos AS INTEGER                        'Y position of a star.π Speed AS INTEGER                       'Speed of star (Parallax effect).π Colour AS INTEGER                      'Colour of a star.πEND TYPEππTYPE CometDataπ xPos AS INTEGER                        'X position of a comet.π yPos AS INTEGER                        'Y position of a comet.π xSpeed AS INTEGER                      'Speed of comet in X direction.π ySpeed AS INTEGER                      'Speed of comet in Y direction.π Visible AS INTEGER                     'Is comet visible.π TailSize AS INTEGER                    'Length of tail in pixels.πEND TYPEππCONST False = 0: True = NOT False       'Boolean constants.ππ'--- Program settings. ------------------------------------------------------πStars = 100                             'Number of stars to plot ?π                                        'Adjust if starfield gets "animated"π                                        '286/20 => 100 and P100 => 600.πUseRetrace = True                       'Use retrace in VGA modes ?πCometSeed = 100                         'Create comet every ... frames.πCometHeadColor = 14                     'Colour of the comet's head.πCometTailColor = 4                      'Colour of the comet's tail.πScrMode = 12                            'Which screenmode to use ?π'--- End program settings. --------------------------------------------------ππComets = 1                              'Number of comet's (KEEP ON 1 !!!)πOPTION BASE 1                           'Start array's with element 1.πREDIM Comet(Comets) AS CometData        'Create array for comet'sπREDIM StarField(Stars) AS StarData      'Create array's for stars.πREDIM OldStarField(Stars) AS StarDataππSELECT CASE ScrMode                     'Determine screen boundaries.π CASE 0π  PRINT "Sorry, graphic modes only! Maybe next time."π  END                                   'See ya later.π CASE 7                                 'EGA 320x200π  HorLimit = 320π  VerLimit = 200π  UseRetrace = False                    'Disable using retrace as delay.π CASE 8                                 'EGA 640x200π  HorLimit = 640π  VerLimit = 200π  UseRetrace = False                    'Disable using retrace as delay.π CASE 9                                 'EGA 640x350π  HorLimit = 640π  VerLimit = 350π  UseRetrace = False                    'Disable using retrace as delay.π CASE 12                                'VGA 640x480π  HorLimit = 640π  VerLimit = 480π CASE 13                                'VGA 320x200π  HorLimit = 320π  VerLimit = 200π CASE ELSE                              'Anything that's NOT tested.π  PRINT "Unsupported videomode."π  END                                   'See ya later.πEND SELECTππ'Initialize program.πSCREEN ScrMode: RANDOMIZE (TIMER)ππ'Fill array with random stars...πFOR I = 1 TO Stars                      'Fill 'er up.π StarField(I).xPos = INT(RND * HorLimit + 1)π StarField(I).yPos = INT(RND * VerLimit + 1)π StarField(I).Speed = INT(RND * 8 + 1)π OldStarField(I).xPos = INT(RND * HorLimit + 1)π OldStarField(I).yPos = INT(RND * VerLimit + 1)π OldStarField(I).Speed = INT(RND * 8 + 1)π SELECT CASE OldStarField(I).Speedπ  CASE 0 TO 3: OldStarField(I).Colour = 8π  CASE 4 TO 7: OldStarField(I).Colour = 7π  CASE 8: OldStarField(I).Colour = 15π END SELECTπ SELECT CASE StarField(I).Speedπ  CASE 0 TO 3: StarField(I).Colour = 8π  CASE 4 TO 7: StarField(I).Colour = 7π  CASE 8: StarField(I).Colour = 15π END SELECTπNEXT Iππ'Fill array with random comet...πComet(1).xPos = INT(RND * HorLimit + 1) 'Pick a random X position.πComet(1).yPos = 1                       'Always start on the top line.πComet(1).xSpeed = INT(RND * 4 + 2)πComet(1).ySpeed = INT(RND * 3 + 2)π'50% of the time the direction of the comet will be altered.πIF INT(RND * 2) = 0 THEN Comet(1).xSpeed = -Comet(1).xSpeedπComet(1).TailSize = INT(RND * 20 + 5)ππDOπ IF INT(RND * CometSeed) = 1 AND NOT CometStart THEN CometStart = -1π FOR I = 1 TO Stars                     'Replot all the stars.π  PSET (StarField(I).xPos, StarField(I).yPos), 0π  StarField(I).xPos = StarField(I).xPos - OldStarField(I).Speedπ π  IF StarField(I).xPos <= 1 THEN        'Recalculate if star hits lower limit.π   StarField(I).xPos = HorLimitπ   StarField(I).yPos = INT(RND * VerLimit + 1)    'Give star new y position.π  END IFπ π  'Enable the lines below if you plan on having a left -> right effect.π  'IF OldStarField(i).xPos >= HorLimit THEN 'Recalculate if star hits higher limit.π  ' OldStarField(i).xPos = 1π  ' OldStarField(i).yPos = INT(RND * VerLimit + 1) 'Give star new y position.π  'END IFπ π  'Put the star on screen at it's modified position.π  PSET (StarField(I).xPos, StarField(I).yPos), StarField(I).Colourπ NEXT Iππ 'Replot comet (This part is needed when the head is NOT off the screen.)π IF CometStart AND NOT CleanTail THENπ  PSET (Comet(1).xPos, Comet(1).yPos), CometTailColorπ  Comet(1).xPos = INT(Comet(1).xPos + Comet(1).xSpeed)π  Comet(1).yPos = INT(Comet(1).yPos + Comet(1).ySpeed)π  IF Comet(1).xPos >= HorLimit OR Comet(1).xPos <= 1 OR Comet(1).yPos >= VerLimit THENπ   CleanTail = True                     'Start removing the tail.π  ELSEπ   PSET (Comet(1).xPos, Comet(1).yPos), CometHeadColorπ   TailxPos = Comet(1).xPos - INT(Comet(1).TailSize * Comet(1).xSpeed)π   TailyPos = Comet(1).yPos - INT(Comet(1).TailSize * Comet(1).ySpeed)π   IF TailxPos >= 1 AND TailyPos >= 1 THEN PSET (TailxPos, TailyPos), 0π  END IFπ END IFπ 'Remove the rest of the tail if the head is moved off the screen.π IF CleanTail THENπ  TailxPos = INT(Comet(1).xPos - Comet(1).TailSize * Comet(1).xSpeed)π  TailyPos = INT(Comet(1).yPos - Comet(1).TailSize * Comet(1).ySpeed)π  Comet(1).TailSize = Comet(1).TailSize - 1π  IF TailxPos >= 1 AND TailyPos >= 1 THEN PSET (TailxPos, TailyPos), 0π π  'Create a new comet.π  IF TailxPos >= HorLimit OR TailxPos <= 1 OR TailyPos >= VerLimit THENπ   Comet(1).xPos = INT(RND * HorLimit + 1) 'Pick a random X position.π   Comet(1).yPos = 1                    'Always start on the top line.π   Comet(1).xSpeed = INT(RND * 4 + 2)π   Comet(1).ySpeed = INT(RND * 3 + 2)π   IF INT(RND * 2) = 0 THEN Comet(1).xSpeed = -Comet(1).xSpeedπ   Comet(1).TailSize = INT(RND * 20 + 5)π   CometStart = Falseπ   CleanTail = Falseπ  END IFπ END IFππ 'Using the Vertical Retrace (VGA+ only) keeps the program from beingπ 'affected by the number of stars to print. If you use 100 or 500 stars onπ 'a P100 doesn't matter. The VR will keep everything going at the same speed.π '(Within certain boundaries). This method works great when used on anythingπ 'faster then my old 286 :-). I think it has something to do with theπ 'frequency of the monitor. SVGA's have a much smoother parallax effect.ππ IF UseRetrace THEN WAIT &H3DA, 8    'Wait for VGA vertical retrace.ππ 'Put your nice scrolly or something over here.π 'LOCATE 14, 30: PRINT "Starfield Simulation..."πLOOP UNTIL INKEY$ <> ""πKurt Kuzba                     DEMYSTIFY SCREEN SAVER         FidoNet QUIK_BAS Echo          06-11-96 (00:00)       QB, QBasic, PDS        55   2548     DEMYST.BAS  'I synched the program execution to the vertical retrace.π'This keeps the display speed constant on nearly any system.π'_|_|_|   DEMYST.BASπ'_|_|_|   A program that demystifies the mystify screen saver.π'_|_|_|   No warrantee or guarantee is given or implied.π'_|_|_|   Released to   PUBLIC DOMAIN   by Kurt Kuzba.  (6/11/96)πDEFINT A-ZπSCREEN 12: RANDOMIZE (TIMER * 1000)πTYPE IntersectPointsπ   x AS INTEGER: y AS INTEGER: dx AS INTEGER: dy AS INTEGER: END TYPEπDIM lnx(60) AS IntersectPointsπlnx(0).x = 0: lnx(0).y = 0: lnx(0).dx = 0: lnx(0).dy = 0πFOR T = 1 TO 59: lnx(T) = lnx(0): NEXTπDOπ   WHILE ((INP(&H3DA)) AND 8) <> 0: WEND  'Here's where I keep the speedπ   WHILE ((INP(&H3DA)) AND 8) = 0: WEND   'constant for almost all systemsπ   FOR L = 0 TO 5π      IF lnx(L).x < 1 THEN lnx(L).dx = 2 + ((RND * 999) MOD 4)π      IF lnx(L).y < 1 THEN lnx(L).dy = 2 + ((RND * 999) MOD 4)π      IF lnx(L).x > 638 THEN lnx(L).dx = -(2 + ((RND * 999) MOD 4))π      IF lnx(L).y > 478 THEN lnx(L).dy = -(2 + ((RND * 999) MOD 4))π      lnx(L).x = lnx(L).x + lnx(L).dx: lnx(L).y = lnx(L).y + lnx(L).dyπ   NEXTπ   FOR L = 0 TO 5π      IF (L MOD 3) <> 0 THENπ         S = L + 54: F = ((L + 1) MOD 6) + 54π         LINE (lnx(S).x, lnx(S).y)-(lnx(F).x, lnx(F).y), 0π      END IFπ      S = L + 48: F = ((L + 1) MOD 6) + 48π      LINE (lnx(S).x, lnx(S).y)-(lnx(F).x, lnx(F).y), 1π      S = L + 42: F = ((L + 1) MOD 6) + 42π      LINE (lnx(S).x, lnx(S).y)-(lnx(F).x, lnx(F).y), 1π      S = L + 36: F = ((L + 1) MOD 6) + 36π      LINE (lnx(S).x, lnx(S).y)-(lnx(F).x, lnx(F).y), 1π      S = L + 30: F = ((L + 1) MOD 6) + 30π      LINE (lnx(S).x, lnx(S).y)-(lnx(F).x, lnx(F).y), 9π      S = L + 24: F = ((L + 1) MOD 6) + 24π      LINE (lnx(S).x, lnx(S).y)-(lnx(F).x, lnx(F).y), 9π      S = L + 18: F = ((L + 1) MOD 6) + 18π      LINE (lnx(S).x, lnx(S).y)-(lnx(F).x, lnx(F).y), 11π      S = L + 12: F = ((L + 1) MOD 6) + 12π      LINE (lnx(S).x, lnx(S).y)-(lnx(F).x, lnx(F).y), 11π      S = L + 6: F = ((L + 1) MOD 6) + 6π      LINE (lnx(S).x, lnx(S).y)-(lnx(F).x, lnx(F).y), 15π      E = (L + 1) MOD 6π      LINE (lnx(L).x, lnx(L).y)-(lnx(E).x, lnx(E).y), 15π   NEXTπ   FOR L = 0 TO 5π      lnx(L + 54) = lnx(L + 48): lnx(L + 48) = lnx(L + 42)π      lnx(L + 42) = lnx(L + 36): lnx(L + 36) = lnx(L + 30)π      lnx(L + 30) = lnx(L + 24): lnx(L + 24) = lnx(L + 18)π      lnx(L + 18) = lnx(L + 12): lnx(L + 12) = lnx(L + 6)π      lnx(L + 6) = lnx(L): NEXTπLOOP WHILE INKEY$ = "": SCREEN 0π'_|_|_|   end   DEMYST.BASπKurt Kuzba                     SHOW ALL COMBINATIONS OF COLORSFidoNet QUIK_BAS Echo          10-01-96 (08:28)       QB, QBasic, PDS        74   2161     ALLHUES.BAS '> >   Actually, that's wrong. You only have 256k (262,000),π'> >   or 63 times 63 times 63. That's the max for your RGBπ'> >   values.π'>   Actually, it's 64 times 64 times 64, because there are 64π'>   degrees, not 63.π'>   Count all the numbers from 0 to 63 inclusively.π'>..........π'   Correct.π'Total number of colors possible is 64^3, or 262,144 colors.π'For those who wish to count them...π'( If anybody actually runs all the way through this programπ'  without hitting a key, they must be something other thanπ'  human :)ππ'_|_|_|   ALLHUES.BASπ'_|_|_|   A display of all the possible color, 8 at a time.π'_|_|_|   Hit a key to quit if you like. Produces 262,144 colors.π'_|_|_|   No warrantee or guarantee is given or implied.π'_|_|_|   Released   PUBLIC DOMAIN   by Kurt Kuzba.  (10/1/96)πRANDOMIZE TIMERπSCREEN 12πSCREEN 0πCOLOR 7, 0πCLSπFOR L% = 2 TO 6π   LOCATE L%, 1π   FOR C% = 8 TO 15π      COLOR C%π      PRINT STRING$(10, CHR$(219));π   NEXTπNEXTπCOLOR 7, 0πColour% = 0πDIM CRED(64) AS INTEGERπDIM CGRN(64) AS INTEGERπDIM CBLU(64) AS INTEGERπFOR t% = 0 TO 64π   CRED(t%) = t%π   CGRN(t%) = t%π   CBLU(t%) = t%πNEXTπ'_|_|_|   Thanks to Bill White, ( of Miami :), for theπ'_|_|_|   neat shuffle routine.πFOR t% = 1 TO 128π   SWAP CRED(t% AND 63), CRED(RND * 63)π   SWAP CGRN(t% AND 63), CGRN(RND * 63)π   SWAP CBLU(t% AND 63), CBLU(RND * 63)πNEXTπFOR RED% = 0 TO 63π   FOR GRN% = 0 TO 63π      FOR BLU% = 0 TO 63π         WAIT &H3DA, 8: WAIT &H3DA, 8, 8π         hue% = 56 + (BLU% AND 7)π         OUT &H3C8, hue%π         OUT &H3C9, CRED(RED%)π         OUT &H3C9, CGRN(GRN%)π         OUT &H3C9, CBLU(BLU%)π         LOCATE 1, 1π         Colour& = Colour& + 1π         Colr$ = MID$(STR$(Colour&), 2)π         txt$ = ""π         p% = LEN(Colr$)π         FOR t% = 1 TO p% - 1π            txt$ = MID$(Colr$, p% - t%, 1) + txt$π            IF t% MOD 3 = 0 THENπ               IF t% < (p% - 1) THEN txt$ = "," + txt$π            END IFπ         NEXTπ         PRINT txt$π         IF INKEY$ <> "" THEN SCREEN 12: SCREEN 0: ENDπ      NEXTπ   NEXTπNEXTπ'_|_|_|   end   ALLHUES.BASπDouglas H. Lusher              ROTATING 3D CYLINDER & SPHERE  comp.lang.basic.misc           10-22-96 (17:52)       QB, QBasic, PDS        276  8552     3DCYLIND.BAS'this is code to draw and rotate a 3-d image of a cylinderπ'  and a sphere.π'by Douglas H. Lusher, October 1996πDECLARE SUB DrawPoly (X%(), Y%(), Vertices%, Culler%)πDECLARE FUNCTION KeyPress% ()πCONST Green = 2, White = 15πCONST ESC = 27πCONST HomeKey = -71, EndKey = -79πCONST UpArrow = -72, DnArrow = -80πCONST LArrow = -75,  RArrow = -77π'the home key brings the object toward the viewer, the end keyπ'   takes it away from the viewer.π'the up arrow moves the object up, the down arrow moves it down,π'   the right arrow moves it right, the left arrow moves it left.π'pressing "y","p", or "r" increases yaw, pitch and roll respectively.π'   pressing the uppercase of these letters decreases the values.πRANDOMIZE TIMERπAPage% = 1: VPage% = 0πSCREEN 9, , APage%, VPage%πScrnWid% = 640: ScrnHgt% = 350πCtrX% = ScrnWid% \ 2: CtrY% = ScrnHgt% \ 2πAspectRatio! = 4 * (ScrnHgt% / ScrnWid%) / 3πPi! = ATN(1) * 4!ππDO: R1! = RND: LOOP UNTIL R1! < .628: R1! = R1! * 10!πDO: R2! = RND: LOOP UNTIL R2! < .628: R2! = R2! * 10!πDO: R3! = RND: LOOP UNTIL R3! < .628: R3! = R3! * 10!π'R1! = 0: R2! = 0: R3! = 0πD! = 1200πMX! = 0: MY! = 0: MZ! = -350πInc! = .02πRInc! = -Inc!πPInc! = -Inc!πYInc! = -Inc!ππGOSUB InitCylinderπ'GOSUB InitSphereππ'MainLoopπDOπ  SELECT CASE KeyPress%π    CASE 0π    CASE UpArrow: MY! = MY! + 10!π    CASE DnArrow: MY! = MY! - 10!π    CASE LArrow: MX! = MX! + 10!π    CASE RArrow: MX! = MX! - 10!π    CASE HomeKey: MZ! = MZ! + 10!π    CASE EndKey: MZ! = MZ! - 10!π    CASE ASC("r")π      RInc! = RInc! + Inc!: IF RInc! > 1 THEN RInc! = 1π    CASE ASC("R")π      RInc! = RInc! - Inc!: IF RInc! < -1 THEN RInc! = -1π    CASE ASC("y")π      YInc! = YInc! + Inc!: IF YInc! > 1 THEN YInc! = 1π    CASE ASC("Y")π      YInc! = YInc! - Inc!: IF YInc! < -1 THEN YInc! = -1π    CASE ASC("p")π      PInc! = PInc! + Inc!: IF PInc! > 1 THEN PInc! = 1π    CASE ASC("P")π      PInc! = PInc! - Inc!: IF PInc! < -1 THEN PInc! = -1π    CASE ESC: EXIT DOπ  END SELECTπ  R1! = R1! + YInc!: IF R1! > 6.28 THEN R1! = 0π  R2! = R2! + RInc!: IF R2! > 6.28 THEN R2! = 0π  R3! = R3! + PInc!: IF R3! > 6.28 THEN R3! = 0π  SR1! = SIN(R1!): CR1! = COS(R1!)π  SR2! = SIN(R2!): CR2! = COS(R2!)π  SR3! = SIN(R3!): CR3! = COS(R3!)π  CLSπ  GOSUB DrawCylinderπ  'GOSUB DrawSphereπ  SWAP APage%, VPage%π  WAIT &H3DA, 8π  SCREEN , , APage%, VPage%πLOOPπSCREEN 0: WIDTH 80πENDπ  πPerspectiveCalculations:πX! = -X!πXA! = CR1! * X! - SR1! * Z!πZA! = SR1! * X! + CR1! * Z!πX! = CR2! * XA! + SR2! * Y!πYA! = CR2! * Y! - SR2! * XA!πZ! = CR3! * ZA! - SR3! * YA!πY! = SR3! * ZA! + CR3! * YA!πX! = X! + MX!πY! = Y! + MY!πZ! = Z! + MZ!πSX% = CINT(D! * X! / Z!) + CtrX%πSY% = CINT(D! * Y! / Z! * AspectRatio!) + CtrY%πRETURNππCheckVisibility:π'plane equation method of hidden surface removalπSP1! = -X1! * (Y2! * Z3! - Y3! * Z2!)πSP2! = X2! * (Y3! * Z1! - Y1! * Z3!)πSP3! = X3! * (Y1! * Z2! - Y2! * Z1!)πVisibleSurface% = ((SP1! - SP2! - SP3!) <= 0)πRETURNππ'========================================================================πInitCylinder:πL! = 40!     'half the length of the cylinderπR! = 20!     'the radius of the cylinderπDivs% = 18   'the number of steps around the cylinderπStepAmount! = (Pi! * 2!) / CSNG(Divs%)πS1% = 1: S2% = Divs% \ 3: S3% = S2% + S2%πREDIM X1!(1 TO Divs% + 1), X2!(1 TO Divs% + 1)πREDIM Y1!(1 TO Divs% + 1), Y2!(1 TO Divs% + 1)πREDIM Z1!(1 TO Divs% + 1), Z2!(1 TO Divs% + 1)πREDIM SX1%(1 TO Divs% + 1), SY1%(1 TO Divs% + 1)πREDIM SX2%(1 TO Divs% + 1), SY2%(1 TO Divs% + 1)πREDIM X%(1 TO 4), Y%(1 TO 4)πXtra% = Divs% + 1πRETURNππDrawCylinder:πR5! = 0πFOR T% = 1 TO Divs%π  XX! = SIN(R5!) * R!: YY! = COS(R5!) * R!π  'one end of cylinderπ  X! = XX!: Y! = YY!: Z! = L!π  GOSUB PerspectiveCalculationsπ  X1!(T%) = X!: Y1!(T%) = Y!: Z1!(T%) = Z!π  SX1%(T%) = SX%: SY1%(T%) = SY%π  'other end of cylinderπ  X! = XX!: Y! = YY!: Z! = -L!π  GOSUB PerspectiveCalculationsπ  X2!(T%) = X!: Y2!(T%) = Y!: Z2!(T%) = Z!π  SX2%(T%) = SX%: SY2%(T%) = SY%π  R5! = R5! + StepAmount!πNEXTπX1!(Xtra%) = X1!(1): X2!(Xtra%) = X2!(1)πY1!(Xtra%) = Y1!(1): Y2!(Xtra%) = Y2!(1)πZ1!(Xtra%) = Z1!(1): Z2!(Xtra%) = Z2!(1)πSX1%(Xtra%) = SX1%(1): SX2%(Xtra%) = SX2%(1)πSY1%(Xtra%) = SY1%(1): SY2%(Xtra%) = SY2%(1)πFOR Q1% = 1 TO Divs%          'draw the side polygons of the cylinderπ  Q2% = Q1% + 1π  X1! = X1!(Q1%): Y1! = Y1!(Q1%): Z1! = Z1!(Q1%)π  X2! = X1!(Q2%): Y2! = Y1!(Q2%): Z2! = Z1!(Q2%)π  X3! = X2!(Q2%): Y3! = Y2!(Q2%): Z3! = Z2!(Q2%)π  GOSUB CheckVisibilityπ  IF VisibleSurface% THENπ    X%(1) = SX1%(Q1%): Y%(1) = SY1%(Q1%)π    X%(2) = SX1%(Q2%): Y%(2) = SY1%(Q2%)π    X%(3) = SX2%(Q2%): Y%(3) = SY2%(Q2%)π    X%(4) = SX2%(Q1%): Y%(4) = SY2%(Q1%)π    CALL DrawPoly(X%(), Y%(), 4, White)π  END IFπNEXTπ'draw one endπX1! = X1!(S1%): Y1! = Y1!(S1%): Z1! = Z1!(S1%)πX2! = X1!(S3%): Y2! = Y1!(S3%): Z2! = Z1!(S3%)πX3! = X1!(S2%): Y3! = Y1!(S2%): Z3! = Z1!(S2%)πGOSUB CheckVisibilityπIF VisibleSurface% THENπ  CALL DrawPoly(SX1%(), SY1%(), Divs%, White)πEND IFπ'draw the other endπX1! = X2!(S1%): Y1! = Y2!(S1%): Z1! = Z2!(S1%)πX2! = X2!(S2%): Y2! = Y2!(S2%): Z2! = Z2!(S2%)πX3! = X2!(S3%): Y3! = Y2!(S3%): Z3! = Z2!(S3%)πGOSUB CheckVisibilityπIF VisibleSurface% THENπ  CALL DrawPoly(SX2%(), SY2%(), Divs%, White)πEND IFπRETURNππ'========================================================================πInitSphere:πR! = 40!            'the radius of the sphereπDivs% = 18πStepAmount! = (Pi! * 2!) / CSNG(Divs%)πREDIM X1!(1 TO Divs% + 1), X2!(1 TO Divs% + 1)πREDIM Y1!(1 TO Divs% + 1), Y2!(1 TO Divs% + 1)πREDIM Z1!(1 TO Divs% + 1), Z2!(1 TO Divs% + 1)πREDIM SX1%(1 TO Divs% + 1), SY1%(1 TO Divs% + 1)πREDIM SX2%(1 TO Divs% + 1), SY2%(1 TO Divs% + 1)πREDIM X%(1 TO 4), Y%(1 TO 4)πXtra% = Divs% + 1πRETURNππDrawSphere:π'north polar areaπ'R5! = 0: X! = SIN(R5!) * R!: Y! = COS(R5!) * R!: Z! = 0πX! = 0!: Y! = R!: Z! = 0πGOSUB PerspectiveCalculationsπX3! = X!: Y3! = Y!: Z3! = Z!πX%(3) = SX%: Y%(3) = SY%πR5! = StepAmount!: GOSUB CalcAroundπFOR Q1% = 1 TO Divs%π  Q2% = Q1% + 1π  X1! = X2!(Q2%): Y1! = Y2!(Q2%): Z1! = Z2!(Q2%)π  X2! = X2!(Q1%): Y2! = Y2!(Q1%): Z2! = Z2!(Q1%)π  GOSUB CheckVisibilityπ  IF VisibleSurface% THENπ    X%(1) = SX2%(Q2%): Y%(1) = SY2%(Q2%)π    X%(2) = SX2%(Q1%): Y%(2) = SY2%(Q1%)π    CALL DrawPoly(X%(), Y%(), 3, Green)π  END IFπNEXTππ'middle of sphereπR5! = StepAmount!πFOR T2% = 1 TO (Divs% \ 2) - 2π  FOR Q1% = 1 TO Divs% + 1π    X1!(Q1%) = X2!(Q1%): Y1!(Q1%) = Y2!(Q1%): Z1!(Q1%) = Z2!(Q1%)π    SX1%(Q1%) = SX2%(Q1%): SY1%(Q1%) = SY2%(Q1%)π  NEXTπ  R5! = R5! + StepAmount!: GOSUB CalcAroundπ  FOR Q1% = 1 TO Divs%π    Q2% = Q1% + 1π    X1! = X1!(Q1%): Y1! = Y1!(Q1%): Z1! = Z1!(Q1%)π    X2! = X1!(Q2%): Y2! = Y1!(Q2%): Z2! = Z1!(Q2%)π    X3! = X2!(Q2%): Y3! = Y2!(Q2%): Z3! = Z2!(Q2%)π    GOSUB CheckVisibilityπ    IF VisibleSurface% THENπ      X%(1) = SX1%(Q1%): Y%(1) = SY1%(Q1%)π      X%(2) = SX1%(Q2%): Y%(2) = SY1%(Q2%)π      X%(3) = SX2%(Q2%): Y%(3) = SY2%(Q2%)π      X%(4) = SX2%(Q1%): Y%(4) = SY2%(Q1%)π      CALL DrawPoly(X%(), Y%(), 4, Green)π    END IFπ  NEXTπNEXTππ'south polar areaπR5! = Pi!: X! = SIN(R5!) * R!: Y! = COS(R5!) * R!: Z! = 0πGOSUB PerspectiveCalculationsπX3! = X!: Y3! = Y!: Z3! = Z!πX%(3) = SX%: Y%(3) = SY%πFOR Q1% = 1 TO Divs%π  Q2% = Q1% + 1π  X1! = X2!(Q1%): Y1! = Y2!(Q1%): Z1! = Z2!(Q1%)π  X2! = X2!(Q2%): Y2! = Y2!(Q2%): Z2! = Z2!(Q2%)π  GOSUB CheckVisibilityπ  IF VisibleSurface% THENπ    X%(1) = SX2%(Q2%): Y%(1) = SY2%(Q2%)π    X%(2) = SX2%(Q1%): Y%(2) = SY2%(Q1%)π    CALL DrawPoly(X%(), Y%(), 3, Green)π  END IFπNEXTπRETURNππCalcAround:πR4! = 0!: XX! = SIN(R5!) * R!: YY! = COS(R5!) * R!πFOR T% = 1 TO Divs%π  X! = COS(R4!) * XX!: Y! = YY!: Z! = SIN(R4!) * XX!π  GOSUB PerspectiveCalculationsπ  X2!(T%) = X!: Y2!(T%) = Y!: Z2!(T%) = Z!π  SX2%(T%) = SX%: SY2%(T%) = SY%π  R4! = R4! + StepAmount!πNEXTπX1!(Xtra%) = X1!(1): X2!(Xtra%) = X2!(1)πY1!(Xtra%) = Y1!(1): Y2!(Xtra%) = Y2!(1)πZ1!(Xtra%) = Z1!(1): Z2!(Xtra%) = Z2!(1)πSX1%(Xtra%) = SX1%(1): SX2%(Xtra%) = SX2%(1)πSY1%(Xtra%) = SY1%(1): SY2%(Xtra%) = SY2%(1)πRETURNππSUB DrawPoly (X%(), Y%(), Vertices%, Culler%)πPSET (X%(Vertices%), Y%(Vertices%)), Culler%πFOR Q% = 1 TO Vertices%π  LINE -(X%(Q%), Y%(Q%)), Culler%πNEXTπEND SUBππFUNCTION KeyPress%πKP$ = INKEY$πIF LEN(KP$) THEN π  KP% = ASC(KP$): IF KP% = 0 THEN KP% = -ASC(MID$(KP$, 2))πEND IFπKeyPress% = KP%πEND FUNCTIONπAndrew L. Ayers                COMPLETE BLAST! (MODE 13H) SUBSandrewa@indirect.com           10-04-96 (00:00)       QB, QBasic, PDS        389  12999    BLASTLIB.BAS'****************************************************************************π'π' Description : Blast! Library - VGA Mode 13 Off-Screen Buffer Manipulationπ'               routinesπ' Written by  : Copyright (c) 1996 by Andrew L. Ayersπ' Date        : 10/04/96π' Comments    : Users of QBASIC will find that this program just barelyπ'               fits into their environment. This is because QBASIC onlyπ'               allows 160K of memory for code AND data. Since I createπ'               two off-screen buffers of 64K each, this leaves only 32Kπ'               for code and any other buffers. In most cases, you shouldπ'               need only one off-screen buffer, giving you 96K for bothπ'               code and any other buffers. There shouldn't be any problemsπ'               with QuickBASIC, though, since it allows you to use 64K forπ'               each procedure, and the rest of memory for your data. Noticeπ'               the use of REDIM for the declaration of the buffers. This isπ'               so I could resize the buffers to zero at the end of theπ'               program. When I was coding this in QBASIC, I realized I need-π'               ed to do this when HELP would no longer load due to lowπ'               memory!π'π'               If you want to view the source for the assembler routines,π'               they are contained within the ".ASM" files included in thisπ'               archive.π'π'               I went to a lot of time and trouble to create this libraryπ'               of routines. They are intended to fill a void that hasπ'               existed for a while. I am distributing this library as free-π'               ware, though I am retaining the copyright. You may use thisπ'               library in any way you see fit. I only ask that you put myπ'               name somewhere in your opening credits. Something likeπ'               "Sprite Routines developed by Andrew L. Ayers" or "Developedπ'               using the Blast! Library by Andrew L. Ayers". Other thanπ'               that, it's free. Thank you, and have phun!π'π'****************************************************************************π'π' Declare our proceduresπ'πDECLARE SUB DrawLine (dsegment%, doffset%, x1%, y1%, x2%, y2%, colr%)πDECLARE SUB BlastGet (dsegment%, doffset%, ssegment%, soffset%, x1%, y1%, x2%, y2%)πDECLARE SUB BlastPut (dsegment%, doffset%, ssegment%, soffset%, xpos%, ypos%, icol%)πDECLARE SUB BlastPset (segment%, offset%, xpos%, ypos%, col%)πDECLARE SUB BlastCopy (fsegment%, foffset%, tsegment%, toffset%)π'π' Reserve assembler routine code memoryπ'πDIM SHARED code1%(14), code2%(21), code3%(76), code4%(76)π'π' BlastCopy! (BLSTCOPY.ASM)π'πcode$ = "1E5589E58B460E8ED88B760C8B460A8EC08B7E08B9007DF3A55D1FCA0800"π'πDEF SEG = VARSEG(code1%(0))π'πFOR i% = 0 TO 29π  d% = VAL("&h" + MID$(code$, i% * 2 + 1, 2))π  POKE VARPTR(code1%(0)) + i%, d%πNEXT i%π'πDEF SEGπ'π' BlastPset! (BLSTPSET.ASM)π'πcode$ = "1E5589E58B46108ED88B760AB106D3E689F3B102D3E601DE8B5E0C01DE8B5E0E01DE8A460888045D1FCA0A00"π'πDEF SEG = VARSEG(code2%(0))π'πFOR i% = 0 TO 43π  d% = VAL("&h" + MID$(code$, i% * 2 + 1, 2))π  POKE VARPTR(code2%(0)) + i%, d%πNEXT i%π'πDEF SEGπ'π' BlastPut! (BLASTPUT.ASM)π'πcode$ = "1E5589E58B460C508B460A508B46108ED88B760E8B04B103D3E8508B5EFE"πcode$ = code$ + "01C3895EFE8B4402508B5EFC01C3895EFC83C60489760E89E58B46188ED8"πcode$ = code$ + "8B76168A04468976163A461074208B5E1C8EDB8B7612B106D3E689F3B102"πcode$ = code$ + "D3E601DE8B5E1401DE8B5E1A01DE88048B4614408946148B460639461475"πcode$ = code$ + "BE8B46142B46028946148B4612408946128B460439461275A6585858585D"πcode$ = code$ + "1FCA0E00"π'πDEF SEG = VARSEG(code3%(0))π'πFOR i% = 0 TO 153π  d% = VAL("&h" + MID$(code$, i% * 2 + 1, 2))π  POKE VARPTR(code3%(0)) + i%, d%πNEXT i%π'πDEF SEGπ'π' BlastGet! (BLASTGET.ASM)π'πcode$ = "1E5589E58B460A508B4608508B460A2B460E40508B46082B460C40508B46128ED8"πcode$ = code$ + "8B76108B46FABB0800F7E3890446468B46F88904464689761089E58B5E"πcode$ = code$ + "1E8EDB8B7614B106D3E689F3B102D3E601DE8B5E1601DE8B5E1C01DE8A"πcode$ = code$ + "048B5E1A8EDB8B76188804468976188B4616408946168B460639461676"πcode$ = code$ + "C38B46162B46028946168B4614408946148B460439461476AB58585858"πcode$ = code$ + "5D1FCA1000"π'πDEF SEG = VARSEG(code4%(0))π'πFOR i% = 0 TO 153π  d% = VAL("&h" + MID$(code$, i% * 2 + 1, 2))π  POKE VARPTR(code4%(0)) + i%, d%πNEXT i%π'πDEF SEGπ'π'****************************************************************************π'π' Reserve memory for two off-screen buffers, sprites and demo variablesπ' Use REDIM so that we may de-allocate the memory at the end of the programπ'πREDIM buffer1%(31999) ' This is an off-screen bufferπREDIM buffer2%(31999) ' This is another...πREDIM sbuffer%(2000)  ' This is our sprite bufferπ'πDIM bx%(40), by%(40), bt%(40), dx%(40), dy%(40)' Variables for demoπ'π'****************************************************************************π'π' Initialize Ballsπ'πFOR t = 0 TO 39π  bx%(t) = INT(RND * 200) + 50: by%(t) = INT(RND * 100) + 50π  bt%(t) = INT(RND * 2)π  DOπ    dx%(t) = INT(RND * 11) - 5: dy%(t) = INT(RND * 11) - 5π  LOOP UNTIL dx%(t) <> 0 AND dy%(t) <> 0πNEXT tπ'πSCREEN 13π'π' Now, show some instructionsπ'πCOLOR 2πLOCATE 2, 2: PRINT "Blast! Library Demo by Andrew L. Ayers"π'πCOLOR 15πLOCATE 4, 1: PRINT "The following demo illustrates a simple"πLOCATE 5, 1: PRINT "use of the Blast! Library. Many 32 x 32"πLOCATE 6, 1: PRINT "and 16 x 16 sprites (up to 40) bounce on"πLOCATE 7, 1: PRINT "the screen in random directions. Use the"πLOCATE 8, 1: PRINT "+/- keys to add or subtract sprites from"πLOCATE 9, 1: PRINT "the screen. Notice how the sprites can"πLOCATE 10, 1: PRINT "overlap each other, without showing a"πLOCATE 11, 1: PRINT "black border. This masking effect is"πLOCATE 12, 1: PRINT "done by simply specifying black (0) as"πLOCATE 13, 1: PRINT "the invisible color. While in this demo"πLOCATE 14, 1: PRINT "I am using 32 x 32 and 16 x 16 sprites,"πLOCATE 15, 1: PRINT "any size sprite could be used. It all"πLOCATE 16, 1: PRINT "depends on the level of detail your"πLOCATE 17, 1: PRINT "sprites need as well as the number of"πLOCATE 18, 1: PRINT "sprites you place on screen at one time."π'π' Draw a simple graphic for the backgroundπ'πCOLOR 4πLOCATE 21, 3: PRINT "Please wait - Preparing Images.";π'πx1% = 159: y1% = 99: colr% = 0π'πFOR t% = 0 TO 319 STEP 4π  CALL DrawLine(VARSEG(buffer2%(0)), VARPTR(buffer2%(0)), x1%, y1%, t%, 0, colr%)π  colr% = colr% + 1: IF colr% > 255 THEN colr% = 0πNEXTπ'πPRINT ".";π'πFOR t% = 0 TO 199 STEP 4π  CALL DrawLine(VARSEG(buffer2%(0)), VARPTR(buffer2%(0)), x1%, y1%, 319, t%, colr%)π  colr% = colr% + 1: IF colr% > 255 THEN colr% = 0πNEXTπ'πPRINT ".";π'πFOR t% = 319 TO 0 STEP -4π  CALL DrawLine(VARSEG(buffer2%(0)), VARPTR(buffer2%(0)), x1%, y1%, t%, 199, colr%)π  colr% = colr% + 1: IF colr% > 255 THEN colr% = 0πNEXTπ'πPRINT ".";π'πFOR t% = 199 TO 0 STEP -4π  CALL DrawLine(VARSEG(buffer2%(0)), VARPTR(buffer2%(0)), x1%, y1%, 0, t%, colr%)π  colr% = colr% + 1: IF colr% > 255 THEN colr% = 0πNEXTπ'πCOLOR 2πLOCATE 21, 1: PRINT "Hit any key to begin demo - [ESC] exits"πCOLOR 15π'πDO: LOOP UNTIL INKEY$ <> ""π'πCLSπ'π' Create a 32 x 32 sprite for us to useπ'πo = 0πFOR t% = 14 TO 0 STEP -1π  c% = 31 - t%π  CIRCLE (15 + o, 15 + o), t%, c%π  PAINT (15 + o, 15 + o), c%π  o = o - .4πNEXT t%π'π' Get our spritesπ'πCALL BlastGet(&HA000, 0, VARSEG(sbuffer%(0)), VARPTR(sbuffer%(0)), 0, 0, 31, 31)π'πLINE (11, 11)-(18, 18), 0, BF ' Clear out centerπ'πCALL BlastGet(&HA000, 0, VARSEG(sbuffer%(0)), VARPTR(sbuffer%(514)), 7, 7, 22, 22)π'π' Initialize Demo Variablesπ'πnumballs% = 10: done% = 0π'πDOπ  'π  ' Copy our background graphic to our off-screen buffer (which clears offπ  ' old images of our sprites...) If you are using only a single buffer, justπ  ' "get" the background behind each sprite before moving, move, then replaceπ  ' the background, or just erase with the "ERASE arrayname" (see HELP)π  ' command. I could done the "get, move, replace" on this demo, but I wantedπ  ' to show how to use a background using the library...π  'π  CALL BlastCopy(VARSEG(buffer2%(0)), VARPTR(buffer2%(0)), VARSEG(buffer1%(0)), VARPTR(buffer1%(0)))π  'π  ' Put our spritesπ  'π  FOR t% = 0 TO numballs% - 1π    bx%(t%) = bx%(t%) + dx%(t%): by%(t%) = by%(t%) + dy%(t%)π    IF bx%(t%) > 287 THEN dx%(t%) = -dx%(t%): bx%(t%) = 287π    IF bx%(t%) < 0 THEN dx%(t%) = -dx%(t%): bx%(t%) = 0π    IF by%(t%) > 167 THEN dy%(t%) = -dy%(t%): by%(t%) = 167π    IF by%(t%) < 0 THEN dy%(t%) = -dy%(t%): by%(t%) = 0π    CALL BlastPut(VARSEG(buffer1%(0)), VARPTR(buffer1%(0)), VARSEG(sbuffer%(0)), VARPTR(sbuffer%(bt%(t%) * 514)), bx%(t%), by%(t%), 0)π  NEXTπ  'π  ' Copy the off-screen buffer to the visible screenπ  'π  CALL BlastCopy(VARSEG(buffer1%(0)), VARPTR(buffer1%(0)), &HA000, 0)π  'π  ' Get user input for number of balls, or exitπ  'π  a$ = INKEY$π  SELECT CASE a$π    CASE "-", "_"π      numballs% = numballs% - 1π      IF numballs% < 1 THEN numballs% = 1π    CASE "+", "="π      numballs% = numballs% + 1π      IF numballs% > 40 THEN numballs% = 40π    CASE CHR$(27)π      done% = 1π  END SELECTπ  'πLOOP UNTIL done%π'πCLSπ'π' Deallocate our large buffers, using REDIM to size to zeroπ'πREDIM buffer1%(0) ' This is an off-screen bufferπREDIM buffer2%(0) ' This is another...πREDIM sbuffer%(0) ' This is our sprite bufferππSUB BlastCopy (fsegment%, foffset%, tsegment%, toffset%)π  'π  ' No error checking is done for this routine, so be careful whenπ  ' you set the from and to segements and offsets - you could crashπ  ' your machine...π  'π  WAIT &H3DA, 8              ' Wait for vertical retraceπ  'π  ' Copy!π  'π  DEF SEG = VARSEG(code1%(0))π  'π  CALL ABSOLUTE(BYVAL fsegment%, BYVAL foffset%, BYVAL tsegment%, BYVAL toffset%, VARPTR(code1%(0)))π  'π  DEF SEGπ  'πEND SUBππSUB BlastGet (dsegment%, doffset%, ssegment%, soffset%, x1%, y1%, x2%, y2%)π  'π  ' No error checking is done for X and Y coordinates, nor for any segmentsπ  ' and offsets into memory. Therefore, use care when setting them so youπ  ' don't crash your machine.π  'π  DEF SEG = VARSEG(code4%(0))π  'π  CALL ABSOLUTE(BYVAL dsegment%, BYVAL doffset%, BYVAL ssegment%, BYVAL soffset%, BYVAL x1%, BYVAL y1%, BYVAL x2%, BYVAL y2%, VARPTR(code4%(0)))π  'π  DEF SEGπ  'πEND SUBππSUB BlastPset (segment%, offset%, xpos%, ypos%, col%)π  'π  ' No error checking is done for X and Y coordinates, nor for any segmentsπ  ' and offsets into memory. Therefore, use care when setting them so youπ  ' don't crash your machine.π  'π  ' Plot the pixel!π  'π  DEF SEG = VARSEG(code2%(0))π  'π  CALL ABSOLUTE(BYVAL segment%, BYVAL offset%, BYVAL xpos%, BYVAL ypos%, BYVAL col%, VARPTR(code2%(0)))π  'π  DEF SEGπ  'πEND SUBππSUB BlastPut (dsegment%, doffset%, ssegment%, soffset%, xpos%, ypos%, icol%)π  'π  ' No error checking is done for X and Y coordinates, nor for any segmentsπ  ' and offsets into memory. Therefore, use care when setting them so youπ  ' don't crash your machine.π  'π  DEF SEG = VARSEG(code3%(0))π  'π  CALL ABSOLUTE(BYVAL dsegment%, BYVAL doffset%, BYVAL ssegment%, BYVAL soffset%, BYVAL xpos%, BYVAL ypos%, BYVAL icol%, VARPTR(code3%(0)))π  'π  DEF SEGπ  'πEND SUBππSUB DrawLine (dsegment%, doffset%, x1%, y1%, x2%, y2%, colr%)π  'π  ' This is a simple routine which uses the traditionalπ  ' Bresenham Algorithm to draw a line between two points.π  ' It is pretty fast, but not fast enough for REAL workπ  ' (like 3D and such) but you can use it if you want. Iπ  ' plan on making an assembler version which should beπ  ' MUCH faster.π  'π  ' No error checking is performed for endpoints in this routine,π  ' so be careful not to let the ends fall out of bounds, sinceπ  ' doing so may cause your machine to crash...π  'π  DEF SEG = dsegment%π  'π  error.term% = 0π  'π  xdiff% = x2% - x1%: ydiff% = y2% - y1%π  xstep% = 1: ystep% = 320π  'π  IF x1% >= x2% THEN xstep% = -1: xdiff% = -xdiff%π  IF y1% >= y2% THEN ystep% = -320: ydiff% = -ydiff%π  'π  xend% = ABS(xdiff%) - 1: yend% = ABS(ydiff%) - 1π  'π  tt& = doffset% + (y1% * 320) + x1%π  'π  IF xdiff% > ydiff% THENπ    'π    FOR xx% = 0 TO xend%π      POKE tt&, colr%π      tt& = tt& + xstep%π      error.term% = error.term% + ydiff%π      IF error.term% >= xdiff% THENπ        tt& = tt& + ystep%π        error.term% = error.term% - xdiff%π      END IFπ    NEXTπ    'π  ELSEπ    'π    FOR yy% = 0 TO yend%π      POKE tt&, colr%π      tt& = tt& + ystep%π      error.term% = error.term% + xdiff%π      IF error.term% >= ydiff% THENπ        tt& = tt& + xstep%π        error.term% = error.term% - ydiff%π      END IFπ    NEXTπ    'π  END IFπ  'π  DEF SEGπ  'πEND SUBπAndrew L. Ayers                BLAST! MODE 13H GET ROUTINE    andrewa@indirect.com           10-04-96 (00:00)       QB, QBasic, PDS        213  7929     BLASTGET.BASDIM code1%(76), code2%(76), sbuffer%(1000)π'π' BlastGet Routine  (ASM Source tacked on at end)π'πcode$ = "1E5589E58B460A508B4608508B460A2B460E40508B46082B460C40508B46128ED8"πcode$ = code$ + "8B76108B46FABB0800F7E3890446468B46F88904464689761089E58B5E"πcode$ = code$ + "1E8EDB8B7614B106D3E689F3B102D3E601DE8B5E1601DE8B5E1C01DE8A"πcode$ = code$ + "048B5E1A8EDB8B76188804468976188B4616408946168B460639461676"πcode$ = code$ + "C38B46162B46028946168B4614408946148B460439461476AB58585858"πcode$ = code$ + "5D1FCA1000"π'πDEF SEG = VARSEG(code1%(0))π'πFOR i% = 0 TO 153π  d% = VAL("&h" + MID$(code$, i% * 2 + 1, 2))π  POKE VARPTR(code1%(0)) + i%, d%πNEXT i%π'πDEF SEGπ'π' BlastPut Routineπ'πcode$ = "1E5589E58B460C508B460A508B46108ED88B760E8B04B103D3E8508B5EFE"πcode$ = code$ + "01C3895EFE8B4402508B5EFC01C3895EFC83C60489760E89E58B46188ED8"πcode$ = code$ + "8B76168A04468976163A461074208B5E1C8EDB8B7612B106D3E689F3B102"πcode$ = code$ + "D3E601DE8B5E1401DE8B5E1A01DE88048B4614408946148B460639461475"πcode$ = code$ + "BE8B46142B46028946148B4612408946128B460439461275A6585858585D"πcode$ = code$ + "1FCA0E00"π'πDEF SEG = VARSEG(code2%(0))π'πFOR i% = 0 TO 153π  d% = VAL("&h" + MID$(code$, i% * 2 + 1, 2))π  POKE VARPTR(code2%(0)) + i%, d%πNEXT i%π'πDEF SEGπ'πSCREEN 13π'πLINE (5, 5)-(10, 10), 15, BFπ'π' Get our spriteπ'πdbufferseg% = &HA000: dbufferptr% = 0π'πDEF SEG = VARSEG(code1%(0))π'πx1% = 0: y1% = 0: x2% = 15: y2% = 15πCALL ABSOLUTE(BYVAL dbufferseg%, BYVAL dbufferptr%, BYVAL VARSEG(sbuffer%(0)), BYVAL VARPTR(sbuffer%(0)), BYVAL x1%, BYVAL y1%, BYVAL x2%, BYVAL y2%, VARPTR(code1%(0)))π'πDEF SEGπ'πCLSπ'πdbufferseg% = &HA000: dbufferptr% = 0: icol% = 0π'πDEF SEG = VARSEG(code2%(0))π'πDOπ  xpos% = INT(RND * 300)π  ypos% = INT(RND * 170)π  'π  CALL ABSOLUTE(BYVAL dbufferseg%, BYVAL dbufferptr%, BYVAL VARSEG(sbuffer%(0)), BYVAL VARPTR(sbuffer%(0)), BYVAL xpos%, BYVAL ypos%, BYVAL icol%, VARPTR(code2%(0)))πLOOP UNTIL INKEY$ <> ""π'πDEF SEGππ'******* END BLASTGET.BAS *********ππ-----------------------------------------------------------------------------ππ    Name: BlastGet! - Offscreen Buffer to Sprite Buffer Memory Copyπ    Date: October 11, 1996π  Author: Andrew L. Ayersππ-----------------------------------------------------------------------------πBASIC Calling Procedure:π-----------------------------------------------------------------------------ππDIM code%(76) ' 77 Words Allocatedπ'π' Load hex codes for routine into memory hereπ'πDEF SEG = VARSEG(code%(0)) ' Get code segementπ'π' Call our routineπ'πCALL ABSOLUTE(BYVAL VARSEG(dbuffer%(0)), BYVAL VARPTR(dbuffer%(0)), --->π    BYVAL VARSEG(sbuffer%(0)), BYVAL VARPTR(sbuffer%(0)),        --->π    BYVAL X1%, BYVAL Y1%, BYVAL X2%, BYVAL Y2%, VARPTR(code%(0)))ππDEF SEG ' Reset to default segmentππ-----------------------------------------------------------------------------πStack Descriptor:π-----------------------------------------------------------------------------ππThe following stack layout is only valid after all values are place onto theπstack for operation. In this routine, the layout is not valid until afterπbyte 0x003B is executed (label Get:), due to prior stack manipulation byπboth BASIC and the routine.ππSP Offset Descriptionsπ--------- ------------------------------------- π==[Pushed on by call to routine]=============π   1E      Display Buffer Segmentπ   1C      Display Buffer Offsetπ   1A      Sprite Buffer Segmentπ   18      Sprite Buffer Offsetπ   16      X1 positionπ   14      Y1 positionπ   12      X2 positionπ   10     Y2 position                      π==[Pushed on by BASIC]=======================π   0E      BASIC Return Segmentπ   0C      BASIC Return Offsetπ==[Pushed on by routine]=====================π   0A      DS Registerπ   08      BP Registerπ   06      X2 Positionπ   04      Y2 Positionπ   02      Widthπ   00      Heightππ------- ------- ------  --------------- -------------------------------------πHexCode Label   OpCode  Operands        Remarksπ------- ------- ------  --------------- -------------------------------------π1E    Start:    PUSH    DS        ;Save the Destination Segmentπ55        PUSH    BP        ;Save the Base Pointerππ89E5    Init:    MOV    BP,SP        ;Get the stack pointerπ8B460A        MOV    AX,[BP+0A]    ;Get the X2 position and put it onπ50        PUSH    AX        ;the stack.ππ8B4608        MOV    AX,[BP+08]    ;Get the Y2 position and put it onπ50        PUSH    AX        ;the stack.ππ8B460A        MOV    AX,[BP+0A]    ;Get the X2 position and subtractπ2B460E        SUB    AX,[BP+0E]    ;the X1 position, increment it byπ40        INC     AX        ;1 and place it on the stack (thisπ50        PUSH    AX        ;is now the width).ππ8B4608        MOV    AX,[BP+08]    ;Get the Y2 position and subtractπ2B460C        SUB    AX,[BP+0C]    ;the Y1 position, increment it byπ40        INC    AX        ;1 and place it on the stack (thisπ50        PUSH    AX        ;is now the height).ππ8B4612        MOV    AX,[BP+12]    ;Get the sprite buffer segement andπ8ED8        MOV    DS,AX        ;set the DS to it. Set the SI to theπ8B7610        MOV    SI,[BP+10]    ;sprite buffer offset.π8B46FA        MOV    AX,[BP-06]    ;Get the width, and multiply by 8πBB0800        MOV    BX,0008        ;(for compatability with BASIC's GETπF7E3        MUL    BX        ;routine) and put it into the spriteπ8904        MOV    [SI],AX        ;buffer. Add 2 the the SI toπ46        INC    SI        ;position it at the next data field.π46        INC    SI         π8B46F8        MOV    AX,[BP-08]    ;Get the height, and place it atπ8904        MOV    [SI],AX        ;this position, then add 2 to theπ46        INC    SI        ;SI to set it to the beginning ofπ46        INC    SI        ;actual sprite pixel data, andπ897610        MOV    [BP+10],SI    ;place it on the stack. Then resetπ89E5        MOV    BP,SP        ;the BP for later.ππ8B5E1E    Get:    MOV    BX,[BP+1E]    ;Otherwise, get the display bufferπ8EDB        MOV    DS,BX        ;segment, and point DS to it.π8B7614        MOV    SI,[BP+14]    ;Then get the Y1 position.πB106        MOV    CL,06        ;Multiply it by 64 by using a ShiftπD3E6        SHL    SI,CL        ;Left (SHL) for speed.π89F3        MOV    BX,SI        ;Save the result temporarily.πB102        MOV    CL,02        ;Shift left again to multiply theπD3E6        SHL    SI,CL        ;Y1 position by 256, then add thatπ01DE        ADD    SI,BX        ;value to our saved result.π8B5E16        MOV    BX,[BP+16]    ;Now get the X1 position and add itπ01DE        ADD    SI,BX        ;to the result to get our finalπ8B5E1C        MOV    BX,[BP+1C]    ;offset. Then get the display bufferπ01DE        ADD    SI,BX        ;offset and add the pixel offset.π8A04        MOV    AL,[SI]        ;Get the pixel.ππ8B5E1A        MOV    BX,[BP+1A]    ;Get the sprite buffer segment andπ8EDB        MOV    DS,BX        ;point the DS (Dest. Segment) to it.π8B7618        MOV    SI,[BP+18]    ;Now get the sprite buffer offset.π8804        MOV    [SI],AL        ;Then put the color of the pixel.π46        INC    SI        ;Add 1 to our sprite buffer offsetπ897618        MOV    [BP+18],SI    ;and place it back on the stack.ππ8B4616    Done:    MOV    AX,[BP+16]    ;Get the X1 position.π40        INC    AX        ;Increment the X1 position by 1π894616        MOV    [BP+16],AX    ;and put back on the stackπ8B4606        MOV    AX,[BP+06]    ;Check to see if the width has beenπ394616        CMP    [BP+16],AX    ;reached. If it hasn't, then get theπ76C3        JBE    Get: [003C]    ;next column, otherwise reset theπ8B4616        MOV    AX,[BP+16]    ;X1 position back to the left edgeπ2B4602        SUB    AX,[BP+02]    ;of the sprite by subtracting theπ894616        MOV    [BP+16],AX    ;width.π8B4614        MOV    AX,[BP+14]    ;Get the Y1 position, then incrementπ40        INC    AX        ;it by 1, and place it back on theπ894614        MOV    [BP+14],AX    ;stack. Then check to see if we haveπ8B4604        MOV    AX,[BP+04]    ;finished getting the sprite (Areπ394614        CMP    [BP+14],AX    ;we at the bottom?) If not, then do    π76AB        JBE    Get: [003C]    ;another line...ππ58    Exit:    POP    AX        ;Pop the height off the stack.π58        POP    AX        ;Pop the width off the stack.π58        POP    AX        ;Pop the Y2 off the stack.π58        POP    AX        ;Pop the X2 off the stack.π5D        POP    BP        ;Restore our registers for BASIC,π1F        POP    DS        ;the exit the routine, cleaning upπCA1000        RETF    0010        ;the stack at the end...ππ-----------------------------------------------------------------------------πLength : 154 Bytes (77 Words)π-----------------------------------------------------------------------------πAndrew L. Ayers                BLAST! MODE 13H PUT ROUTINE    andrewa@indirect.com           10-04-96 (00:00)       QB, QBasic, PDS        179  6943     BLASTPUT.BASDIM code1%(76), sbuffer%(1000)π'π' (ASM Source located at end of code)ππcode1$ = ""πcode1$ = code1$ + "1E5589E58B460C508B460A508B46108ED88B760E8B04B103D3E8508B5EFE"πcode1$ = code1$ + "01C3895EFE8B4402508B5EFC01C3895EFC83C60489760E89E58B46188ED8"πcode1$ = code1$ + "8B76168A04468976163A461074208B5E1C8EDB8B7612B106D3E689F3B102"πcode1$ = code1$ + "D3E601DE8B5E1401DE8B5E1A01DE88048B4614408946148B460639461475"πcode1$ = code1$ + "BE8B46142B46028946148B4612408946128B460439461275A6585858585D"πcode1$ = code1$ + "1FCA0E00"π'πDEF SEG = VARSEG(code1%(0))π'πFOR i% = 0 TO 153π  d% = VAL("&h" + MID$(code1$, i% * 2 + 1, 2))π  POKE VARPTR(code1%(0)) + i%, d%πNEXT i%π'πDEF SEGπ'πSCREEN 13π'πLINE (5, 5)-(10, 10), 15, BFπGET (0, 0)-(15, 15), sbuffer%(0)π'πCLSπ'πdbufferseg% = &HA000: dbufferptr% = 0: icol% = 0: cnt% = 0π'πDEF SEG = VARSEG(code1%(0))π'πt = TIMERπDOπ  xpos% = INT(RND * 300)π  ypos% = INT(RND * 170)π  'π  CALL ABSOLUTE(BYVAL dbufferseg%, BYVAL dbufferptr%, BYVAL VARSEG(sbuffer%(0)), BYVAL VARPTR(sbuffer%(0)), BYVAL xpos%, BYVAL ypos%, BYVAL icol%, VARPTR(code1%(0)))π  cnt% = cnt% + 1πLOOP UNTIL cnt% = 1000πPRINT TIMER - tπDEF SEGππ'******** END BLASTPUT.BAS ********ππ-----------------------------------------------------------------------------ππ    Name: BlastPut! - Sprite Buffer to Offscreen Buffer Memory Copyπ    Date: September 30, 1996π  Author: Andrew L. Ayersππ-----------------------------------------------------------------------------πBASIC Calling Procedure:π-----------------------------------------------------------------------------ππDIM code%(76) ' 77 Words Allocatedπ'π' Load hex codes for routine into memory hereπ'πDEF SEG = VARSEG(code%(0)) ' Get code segementπ'π' Call our routineπ'πCALL ABSOLUTE(BYVAL VARSEG(dbuffer%(0)), BYVAL VARPTR(dbuffer%(0)), --->π    BYVAL VARSEG(sbuffer%(0)), BYVAL VARPTR(sbuffer%(0)),        --->π    BYVAL xpos%, BYVAL ypos%, BYVAL icol%, VARPTR(code%(0)))ππDEF SEG ' Reset to default segmentππ-----------------------------------------------------------------------------πStack Descriptor:π-----------------------------------------------------------------------------ππThe following stack layout is only valid after all values are place onto theπstack for operation. In this routine, the layout is not valid until afterπbyte 0x0036 is executed (label Plot:), due to prior stack manipulation byπboth BASIC and the routine.ππSP Offset Descriptionsπ--------- ------------------------------------- π==[Pushed on by call to routine]=============π   1C      Display Buffer Segmentπ   1A      Display Buffer Offsetπ   18      Sprite Buffer Segmentπ   16      Sprite Buffer Offsetπ   14      X positionπ   12      Y positionπ   10      Invisible Color                      π==[Pushed on by BASIC]=======================π   0E      BASIC Return Segmentπ   0C      BASIC Return Offsetπ==[Pushed on by routine]=====================π   0A      DS Registerπ   08      BP Registerπ   06      Width + X Positionπ   04      Height + Y Positionπ   02      Widthπ   00      Heightππ------- ------- ------  --------------- -------------------------------------πHexCode Label   OpCode  Operands        Remarksπ------- ------- ------  --------------- -------------------------------------π1E    Start:    PUSH    DS        ;Save the DS register for BASICπ55        PUSH    BP        ;Save the BP register for BASICππ89E5    Init:    MOV    BP,SP        ;Get the stack pointerπ8B460C        MOV    AX,[BP+0C]    ;Get the X positionπ50        PUSH    AX        ;Put the X position on the stackπ8B460A        MOV    AX,[BP+0A]    ;Get the Y positionπ50        PUSH    AX        ;Put the Y position on the stackπ8B4610        MOV    AX,[BP+10]    ;Get the sprite buffer segmentπ8ED8        MOV    DS,AX        ;Point the DS (Dest. Segment) to itπ8B760E        MOV    SI,[BP+0E]    ;Get the sprite buffer offsetπ8B04        MOV    AX,[SI]        ;Get the width, and divide by 8πB103        MOV    CL,03        ;(using SHR for speed) to obtain theπD3E8        SHR    AX,CL        ;true width in pixelsπ50        PUSH    AX        ;Put the width on the stackπ8B5EFE        MOV    BX,[BP-02]    ;Get the X positionπ01C3        ADD    BX,AX        ;Add width to the X positionπ895EFE        MOV    [BP-02],BX    ;and put it back on the stackπ8B4402        MOV    AX,[SI+02]    ;Get the heightπ50        PUSH    AX        ;Put the height the stackπ8B5EFC        MOV    BX,[BP-04]    ;Get the Y positionπ01C3        ADD    BX,AX        ;Add height to the Y positionπ895EFC        MOV    [BP-04],BX    ;and put it back on the stackπ83C604        ADD    SI,04        ;Reset the sprite buffer offsetπ89760E        MOV    [BP+0E],SI    ;to the start of the pixel dataπ89E5        MOV    BP,SP        ;Retrieve stack pointerππ8B4618    Plot:    MOV    AX,[BP+18]    ;Get the sprite buffer segment andπ8ED8        MOV    DS,AX        ;point the DS (Dest. Segment) to itπ8B7616        MOV    SI,[BP+16]    ;Now get the sprite buffer offsetπ8A04        MOV    AL,[SI]        ;Then get the color of the pixelπ46        INC    SI        ;Add 1 to our sprite buffer offsetπ897616        MOV    [BP+16],SI    ;and place it back on the stackπ3A4610        CMP    AL,[BP+10]    ;Is our pixel invisible?π7420        JZ    Done: [006A]    ;If it is, then don't plot it.π8B5E1C        MOV    BX,[BP+1C]    ;Otherwise, get the display bufferπ8EDB        MOV    DS,BX        ;segment, and point DS to itπ8B7612        MOV    SI,[BP+12]    ;Then get the Y positionπB106        MOV    CL,06        ;Multiply it by 64 by using a ShiftπD3E6        SHL    SI,CL        ;Left (SHL) for speedπ89F3        MOV    BX,SI        ;Save the result temporarilyπB102        MOV    CL,02        ;Shift left again to multiply theπD3E6        SHL    SI,CL        ;Y position by 256, then add thatπ01DE        ADD    SI,BX        ;value to our saved resultπ8B5E14        MOV    BX,[BP+14]    ;Now get the X position and add itπ01DE        ADD    SI,BX        ;to the result to get our finalπ8B5E1A        MOV    BX,[BP+1A]    ;offset. Then get the display bufferπ01DE        ADD    SI,BX        ;offset and add the pixel offset.π8804        MOV    [SI],AL        ;Plot the pixel.ππ8B4614    Done:    MOV    AX,[BP+14]    ;Get the X positionπ40        INC    AX        ;Increment the X position by 1π894614        MOV    [BP+14],AX    ;and put back on the stackπ8B4606        MOV    AX,[BP+06]    ;Check to see if the width has beenπ394614        CMP    [BP+14],AX    ;reached. If it hasn't, then plot theπ75C7        JNZ    Plot: [0037]    ;next column, otherwise reset theπ8B4614        MOV    AX,[BP+14]    ;X position back to the left edgeπ2B4602        SUB    AX,[BP+02]    ;of the sprite by subtracting theπ894614        MOV    [BP+14],AX    ;width.π8B4612        MOV    AX,[BP+12]    ;Get the Y position, then incrementπ40        INC    AX        ;it by 1, and place it back on theπ894612        MOV    [BP+12],AX    ;stack. Then check to see if we haveπ8B4604        MOV    AX,[BP+04]    ;finished drawing the sprite (Areπ394612        CMP    [BP+12],AX    ;we at the bottom?) If not, then do    π75AF        JNZ    Plot: [0037]    ;another line...ππ58    Exit:    POP    AX        ;Pop the height off the stackπ58        POP    AX        ;Pop the width off the stackπ58        POP    AX        ;Pop the height + y off the stackπ58        POP    AX        ;Pop the width + x off the stackπ5D        POP    BP        ;Restore our registers for BASIC,π1F        POP    DS        ;the exit the routine, cleaning upπCA0E00        RETF    000E        ;the stack at the end...ππ-----------------------------------------------------------------------------πLength : 154 Bytes (77 Words)π-----------------------------------------------------------------------------πAndrew L. Ayers                BLAST! MODE 13H PSET ROUTINE   andrewa@indirect.com           10-04-96 (00:00)       QB, QBasic, PDS        71   2331     BLSTPSET.BASDIM buffer%(31999), code1%(29), code2%(43)π'π' Assembler code (code1) is as follows:π'π' 1E            PUSH    DS              ' Save the Data Segmentπ' 55            PUSH    BP              ' Save the Base Pointerπ' 89E5          MOV     BP,SP           ' Get the Stack Pointerπ' 8B460A        MOV     AX,[BP+0A]      ' Let AX=Buffer Segment Addressπ' 8ED8          MOV     DS,AX           ' Set the Data Segment=AXπ' 8B7608        MOV     SI,[BP+08]      ' Let Source Index(SI)=Buffer Offsetπ' B800A0        MOV     AX,A000         ' Set AX=Start of Video (13h)π' 8EC0          MOV     ES,AX           ' Set the Extra Segmentπ' BF0000        MOV     DI,0000         ' Set the Destination Index to 0π' B9007D        MOV     CX,7D00         ' Number of words to copy (32000)π' F3A5          REP     MOVSW           ' Move the words!π' 5D            POP     BP              ' Reset the Base Pointerπ' 1F            POP     DS              ' Reset the Data Segmentπ' CA0400        RETF    0004            ' Return to BASIC Program, clean upπ'                                         stack...π'π' Assembler code (code2) is as follows:π'πcode1$ = "1E5589E58B460A8ED88B7608B800A08EC0BF0000B9007DF3A55D1FCA0400"πcode2$ = "1E5589E58B46108ED88B760AB106D3E689F3B102D3E601DE8B5E0C01DE8B5E0E01DE8A460888045D1FCA0A00"π'π' Now we poke the code into the memory reserved for it:π'πDEF SEG = VARSEG(code1%(0))π'πFOR i% = 0 TO 29π  d% = VAL("&h" + MID$(code1$, i% * 2 + 1, 2))π  POKE VARPTR(code1%(0)) + i%, d%πNEXT i%π'πDEF SEGπ'πDEF SEG = VARSEG(code2%(0))π'πFOR i% = 0 TO 43π  d% = VAL("&h" + MID$(code2$, i% * 2 + 1, 2))π  POKE VARPTR(code2%(0)) + i%, d%πNEXT i%π'πDEF SEGπ'πSCREEN 13π'πDOπ  'π  ' First, clear out our buffer (kinda like cls 0)π  'π  ERASE buffer%π  'π  ' Set some random pixels using our new routine...π  'π  DEF SEG = VARSEG(code2%(0))π  FOR t% = 1 TO 300π    x% = INT(RND * 320)π    y% = INT(RND * 200)π    c% = INT(RND * 256)π    CALL ABSOLUTE(BYVAL VARSEG(buffer%(0)), BYVAL VARPTR(buffer%(0)), BYVAL x%, BYVAL y%, BYVAL c%, VARPTR(code2%(0)))π  NEXT t%π  DEF SEGπ  'π  ' Blast it to screen!π  'π  DEF SEG = VARSEG(code1%(0))π  CALL ABSOLUTE(BYVAL VARSEG(buffer%(0)), BYVAL VARPTR(buffer%(0)), VARPTR(code1%(0)))π  DEF SEGπ  'πLOOP UNTIL INKEY$ <> ""πAndrew L. Ayers                BLAST! MODE 13H SPRITE ROUTINE andrewa@indirect.com           10-04-96 (00:00)       QB, QBasic, PDS        102  3222     BLSTSPRT.BASDIM sprite%(15, 15), buffer%(31999), code1%(29), code2%(43)π'π' Assembler code (code1) is as follows:π'π' 1E            PUSH    DS              ' Save the Data Segmentπ' 55            PUSH    BP              ' Save the Base Pointerπ' 89E5          MOV     BP,SP           ' Get the Stack Pointerπ' 8B460A        MOV     AX,[BP+0A]      ' Let AX=Buffer Segment Addressπ' 8ED8          MOV     DS,AX           ' Set the Data Segment=AXπ' 8B7608        MOV     SI,[BP+08]      ' Let Source Index(SI)=Buffer Offsetπ' B800A0        MOV     AX,A000         ' Set AX=Start of Video (13h)π' 8EC0          MOV     ES,AX           ' Set the Extra Segmentπ' BF0000        MOV     DI,0000         ' Set the Destination Index to 0π' B9007D        MOV     CX,7D00         ' Number of words to copy (32000)π' F3A5          REP     MOVSW           ' Move the words!π' 5D            POP     BP              ' Reset the Base Pointerπ' 1F            POP     DS              ' Reset the Data Segmentπ' CA0400        RETF    0004            ' Return to BASIC Program, clean upπ'                                         stack...π'π' Assembler code (code2) is as follows:π'πcode1$ = "1E5589E58B460A8ED88B7608B800A08EC0BF0000B9007DF3A55D1FCA0400"πcode2$ = "1E5589E58B46108ED88B760AB106D3E689F3B102D3E601DE8B5E0C01DE8B5E0E01DE8A460888045D1FCA0A00"π'π' Now we poke the code into the memory reserved for it:π'πDEF SEG = VARSEG(code1%(0))π'πFOR i% = 0 TO 29π  d% = VAL("&h" + MID$(code1$, i% * 2 + 1, 2))π  POKE VARPTR(code1%(0)) + i%, d%πNEXT i%π'πDEF SEGπ'πDEF SEG = VARSEG(code2%(0))π'πFOR i% = 0 TO 43π  d% = VAL("&h" + MID$(code2$, i% * 2 + 1, 2))π  POKE VARPTR(code2%(0)) + i%, d%πNEXT i%π'πDEF SEGπ'π'***************************************************************π'πDATA 0,0,0,0,0,F,F,F,F,F,F,0,0,0,0,0πDATA 0,0,0,F,F,4,4,4,4,4,4,F,F,0,0,0πDATA 0,0,F,4,4,4,4,4,4,4,4,4,4,F,0,0πDATA 0,F,4,4,4,4,4,4,4,4,4,4,4,4,F,0πDATA 0,F,4,4,4,3,3,3,3,3,3,4,4,4,F,0πDATA F,4,4,4,3,3,0,0,0,0,3,3,4,4,4,FπDATA F,4,4,4,3,0,0,0,0,0,0,3,4,4,4,FπDATA F,4,4,4,3,0,0,0,0,0,0,3,4,4,4,FπDATA F,4,4,4,3,0,0,0,0,0,0,3,4,4,4,FπDATA F,4,4,4,3,0,0,0,0,0,0,3,4,4,4,FπDATA F,4,4,4,3,3,0,0,0,0,3,3,4,4,4,FπDATA 0,F,4,4,4,3,3,3,3,3,3,4,4,4,F,0πDATA 0,F,4,4,4,4,4,4,4,4,4,4,4,4,F,0πDATA 0,0,F,4,4,4,4,4,4,4,4,4,4,F,0,0πDATA 0,0,0,F,F,4,4,4,4,4,4,F,F,0,0,0πDATA 0,0,0,0,0,F,F,F,F,F,F,0,0,0,0,0π'πFOR y% = 0 TO 15π  FOR x% = 0 TO 15π    READ valu$π    sprite%(x%, y%) = VAL("&h" + valu$)π  NEXT x%πNEXT y%π'πSCREEN 13π'πDOπ  'π  ' First, clear out our buffer (kinda like cls 0)π  'π  ERASE buffer%π  'π  DEF SEG = VARSEG(code2%(0))π  FOR t% = 1 TO 30π    x% = INT(RND * 300)π    y% = INT(RND * 180)π    'π    FOR yy% = 0 TO 15π      FOR xx% = 0 TO 15π        c% = sprite%(xx%, yy%)π        IF c% THENπ          CALL ABSOLUTE(BYVAL VARSEG(buffer%(0)), BYVAL VARPTR(buffer%(0)), BYVAL xx% + x%, BYVAL yy% + y%, BYVAL c%, VARPTR(code2%(0)))π        END IFπ      NEXTπ    NEXTπ  NEXTπ  DEF SEGπ  'π  ' Blast it to screen!π  'π  DEF SEG = VARSEG(code1%(0))π  CALL ABSOLUTE(BYVAL VARSEG(buffer%(0)), BYVAL VARPTR(buffer%(0)), VARPTR(code1%(0)))π  DEF SEGπ  'πLOOP UNTIL INKEY$ <> ""πAndrew L. Ayers                GET/PUT MANIPULATION ROUTINES  andrewa@indirect.com           10-22-96 (00:00)       QB, QBasic, PDS        149  4990     GPMANIP.BAS 'π' Description : GET/PUT Manipulation Routinesπ' Written by  : Andrew L. Ayersπ' Date        : 10/22/96π'π' These routines show how you can *directly* manipulate the GET/PUT bufferπ' structure to build/destroy/read/write a sprite at any moment. You couldπ' display a sprite, modify the buffer, then display it again - changes andπ' all! These routines are powerful! For a great demonstration, see theπ' GetShift demo, which uses the same techniques to achieve a full (almost)π' screen scroll, with little overhead! For more info, read the commentsπ' within each routine...π'π' You may use this routine in any manner you like, as longπ' as you give credit in an appropriate manner. Have phun!π'πDECLARE SUB GetSpriteData (xsize%, ysize%, x%, y%, num%, colr%)πDECLARE SUB SetSpriteData (xsize%, ysize%, x%, y%, num%, colr%)π'πDIM SHARED buffer%(1000)π'πSCREEN 13π'π' Play with these lines...π'π'LINE (1, 1)-(14, 14), 12, BFπ'LINE (4, 4)-(11, 11), 4, BFπ'GET (0, 0)-(15, 15), buffer%(0)π'π'LINE (1, 1)-(14, 14), 15, BFπ'LINE (4, 4)-(11, 11), 3, BFπ'LINE (6, 6)-(9, 9), 235, BFπ'GET (0, 0)-(15, 15), buffer%(130)π'π'PUT (0, 0), buffer%(0), PSETπ'CALL GetSpriteData(16, 16, 6, 6, 1, colr%) ' Get a colorπ'PRINT colr%π'πCLSπ'π' Building a sprite from scratch!π'πCALL SetSpriteData(16, 16, -1, 0, 1, 128) ' Set the Width (16 x 8 = 128)πCALL SetSpriteData(16, 16, -3, 0, 1, 16)  ' Set the Heightπ'πFOR y% = 0 TO 15π  FOR x% = 0 TO 15π    CALL SetSpriteData(16, 16, x%, y%, 1, 12)  ' Dataπ  NEXT x%πNEXT y%π'πFOR y% = 5 TO 10π  FOR x% = 5 TO 10π    CALL SetSpriteData(16, 16, x%, y%, 1, 4)  ' Dataπ  NEXT x%πNEXT y%π'π' Use the *real* PUT command to place our sprite!π'πPUT (50, 50), buffer%(130), PSETππSUB GetSpriteData (xsize%, ysize%, x%, y%, num%, colr%)π  'π  ' xsize% = Width of sprite in pixelsπ  ' ysize% = Height of sprite in linesπ  ' x%     = X position to "get", must be 0-(xsize%-1) (see note below)π  ' y%     = Y position to "get", must be 0-(ysize%-1) (see note below)π  ' num%   = Sprite number offset (0 if buffer only contains one image)π  ' colr%  = Color of pixel retrievedπ  'π  ' **NOTE**π  ' Both x% and y% must be set to values between 0 and "size" - 1. The onlyπ  ' time this rule is not enforced is for the following:π  'π  '   If x% is less than zero (0), and y% equals zero (0), then the followingπ  '   information may be obtained for values of x% :π  'π  '     Value  Informationπ  '     -----  -----------π  '      -1    Low byte of width information (divide by 8 to get true width)π  '      -2    High byte of width informationπ  '      -3    Low byte of height information (true height)π  '      -4    High byte of height informationπ  'π  '   I believe for large sprites (larger than 32 x 256 pixels), both highπ  '   and low bytes will have info in them for width and height, and there-π  '   fore are true integer values (16 bit). In these cases, you will needπ  '   to multiply the byte values out to get the 16 bit real value.π  'π  DEF SEG = VARSEG(buffer%(0))π  'π  spritewords% = ((xsize% * ysize%) / 2) + 2π  'π  IF x% < 0 AND y% = 0 THENπ    offset% = ABS(x%) - 1π  ELSEπ    offset% = ABS(y%) * ysize% + ABS(x%) + 4π  END IFπ  'π  colr% = PEEK(VARPTR(buffer%(num% * spritewords%)) + offset%)π  'π  DEF SEGπ  'πEND SUBππSUB SetSpriteData (xsize%, ysize%, x%, y%, num%, colr%)π  'π  ' xsize% = Width of sprite in pixelsπ  ' ysize% = Height of sprite in linesπ  ' x%     = X position to "set", must be 0-(xsize%-1) (see note below)π  ' y%     = Y position to "set", must be 0-(ysize%-1) (see note below)π  ' num%   = Sprite number offset (0 if buffer only contains one image)π  ' colr%  = Color of pixel to setπ  'π  ' **NOTE**π  ' Both x% and y% must be set to values between 0 and "size" - 1. The onlyπ  ' time this rule is not enforced is for the following:π  'π  '   If x% is less than zero (0), and y% equals zero (0), then the followingπ  '   information may be modified for values of x% :π  'π  '     Value  Informationπ  '     -----  -----------π  '      -1    Low byte of width information (multiply by 8 to set true width)π  '      -2    High byte of width informationπ  '      -3    Low byte of height information (true height)π  '      -4    High byte of height informationπ  'π  '   I believe for large sprites (larger than 32 x 256 pixels), both highπ  '   and low bytes will need to have info in them for width and height, andπ  '   therefore the width/height values will need to be broken down from theπ  '   integer value (16 bit)  to high and low byte values, then sent to thisπ  '   routine.π  'π  DEF SEG = VARSEG(buffer%(0))π  'π  spritewords% = ((xsize% * ysize%) / 2) + 2π  'π  IF x% < 0 AND y% = 0 THENπ    offset% = ABS(x%) - 1π  ELSEπ    offset% = ABS(y%) * ysize% + ABS(x%) + 4π  END IFπ  'π  POKE (VARPTR(buffer%(num% * spritewords%)) + offset%), colr%π  'π  DEF SEGπ  'πEND SUBπAndrew L. Ayers                FAST SPRITE DEMO               andrewa@indirect.com           10-22-96 (00:00)       QB, QBasic, PDS        49   3139     FASTSPRT.BASDEFINT A-Z:DIM SHARED K,S,B&,Z&:V1 'Created by PostIt! 7.2πSUB V1:OPEN "O",1,"FASTSPRT.ZIP",4^6:Z&=2071:?STRING$(50,177);πU"%up()%9%%%d-%+,8'FRd1Uu3*.%%01%%%1%%%%kf%xyxu%wySgIfx\%;:>SoO5vπU"-xNx0QQdo7VSdeC\gu&=<-/w9+qjOk#*GfY#2Q44EWlxvlR0.Bbp](?zB?gGE^kπU"6H[fqMGxgX(EQ]K<B[h+q:ri__A=j/,qp6IpN3hID$l^>n'b-;/_\vadk*Xc<-2πU"v/k0xGi\'/]r#OB9+XYl;JGt9\^fYT0nP)u#7e+4I9]E[Q#2G3Aj#hRaF6i4s1VπU"3ahIh08O4ql_xinr/Ba[iIiNFUJ8?iE<A?+A$'tE*H:Ec=2y=;UHa^3j5Rf2U/8πU"72Y98T$.*s)*3q]*p0#aP=T)e1<6p4VXWP;5\1:3mMv=HPg>nH4injq\/NGC^=QπU"2]A#+CZO1i#jAmE1V;cJTMiqd#iHJ9mu='vlvR70<kaU[-:Qp*GaQ)$0W3[Gs)rπU"&hpm)WMic%^I8K#I\EogEx2-)2SEb^6VFVChuq;R'Cs</?ge(?L^tE3Vqo[#q[/πU"h;cOAGPX_wmq=wHQdN>qV:#+YrTIh_<'*<+IG>*-3Pef+sAbr'GA5Gef31Aj*fQπU"RU2VWU&oo]MT&J#>>c.i.MEg.crI2Jx)f\(q-]tN[2=fwbBV2e<_=WQe-7X7lqiπU"=.[R)kQ0pj8r&uJ(m4.g_f:<\tTQcE;ZLwvPyj$4,roQooZ7wB-ic$C\tfA:gSVπU"Wf$M\^sDJqlcdjTU3NHepw)3jjL=*7\Go;Ik;HEPiRC5laP(U'0KSAw221t+F1hπU"N0ZUlhl>o..q/T'[yl-AXn_1(YD$oNDa&vL:7TX#C;4X(yB\&rMY3I1FupGCYS0πU"^93e6aQ#Tmb&cI3(ex+p&12AV0iTmPNsz4J]F$5Y*_e8?I[$XE(l&$zsW_p/hWwπU";/It63SvWS.Qr$[TVA%[#SU<,:;^GC'_6Gi>CRh:NP8NZ6NPkZO0/MHU8RHb5dQπU"X+.W9,2T?+/gztgd>s,n/Fa.e)Y';Ql$IJxC3Os%Gzk-4oKFI>\%P(KCX[q56DOπU"1[RgzV]qHu\rrJG#MWjh6)[GORb97Od86/7dwL7uwSRynCa^x[387SsjW2?p&\,πU"c]ll=G0=5ku#9'.UG]kk=-fG\yn<6XWh9HFuD#++3bZlL$+:B,ZF]5Q^+IGGxAyπU"/eMAdJ6J5CWJ<Cg*iS*lOJ-'oM4AP-gbZ?*,6IH5V=T^gql.+mt7wtF4aW4BmI=πU"J/rECiTB$pM%G6vKD;Vbtfe*$Dk98&(6$QY#'\>r%'BdBKo\YyZ(xbbjfu+XF-QπU"?8S,\1E72ri=>u'2gz5ZM2x)M(uR[DEof[CO1a0JC<'3\5MrhQpd>iAGEuwLj5NπU"Z(:vze>_/(zbU_NtL\=9yLlrUPt*RAW*mZ(sNE)k$If?OzhUO8NS(:Z0e.CYu_'πU"8Ob^^cZ;/-.Q6A7weDF)vk,?,Q<\gh(E]p%ZVox%xNfwXbN=udbz7\#z8^=%1=DπU"fWe+P#A9:<?Ev6:2un-Jh=p)m6XN:v.5GNi=ewdCL6BEMHuf+Yf))9tsG-LH1<9πU"/%6ceR-*>8v3wV&Ffxpb+;)HhSUh,L,Ds)DP_5Wb8nc;xvNv7YbNKh)NU'cRNbKπU"+.1RP]-slbQebu+G%vFX)&V7:h2G[jZ+?q&&0q6[HxDkfu(JZ7G2wT6Pe5Ay&]]πU"4Z$GV_$<<#G/uw3[-Z'C<]VHSL^h]?-MI]dRDuT&,[9o\5M9nRf6'?+Y3cdn)VcπU"wb):kz+*&_zkndj3?4(igYpO93Q,SWY&<o$x6>sZdL2x;-U^\i<y4TaxPS#4zH7πU"VK+0JHW8g6N'pTup%()9%%%%-%1lb%F7=wWp'T&%%-px%%%.%%%%xmnu%VSxu=wπU"fIv,9Te=a)YVARm&#hPBmcLNaPBP?K')g(QvumTU,L>jeSNoUfzvMkMt$5Qwsm5πU"9Da$Oulum-4Q4I]n;#lkuW#5nq4Hhl(amQHtNal7G^+2(ad8s$kflIMeaV[p1YeπU"8beG#uLWrCbfQZ/^Du3uomZ/8hh?Wg.3h^0?Xs$X_C*Yz^Ct^4surkK6jB0c[E9πU"nhHrHvIdj#$?a;d=U/9&O&(+#1=U/*9O&(%+1=U5/9O&%(+1=UU/9O%&(+1d=U/πU"9&O&(+#1=U/*9O&(%+1=U5/9O&%(+1=UU/9O%&(+1d=U/9&O&(+#1=U/*9O&(%+πU"1=U5/9O&%(+1=UU/9O%&(+1d=U/9&O&(+#1=U/*9O&(%+1=U5/9O&%(+1=UU/9OπU"%&(+1%=Y1?I+2RUOf<o00IU7=%Y1?+12RUfi<o0I(U7=Y%1?+2_RUf<;o0IU&7=πU"Y1#?+2RSUf<oG0IU7#=Y1i'xb1=UU/9O%&(+1d=U/9&O&(+#1=U/*9O&(%+1=U5πU"/9O&%(+1=UU/9OU&RtU%&(+1d=U/9&O&(+#1=U/*9O&(%+1=U5/9O&%(+1=UU/9πU"O%&(+1d=U/9&O&(+#1=U/<i>l#%up&'%9%9%%%%-%5+,'FBRdUu&3*%%&01%%%1πU"%%%%%%%%%&%E%%%%%%%%%kf%xyxu%wySg%fxup%&'9%%9%%%#-%lb&%F=w9WpT&πU"m%%px%%%.%%%%%%%%%%%%E%%%&]*%%%xmnu%VSxu%wup*%+%%%%%'%'(%#%%(%_πU",%%%%%πEND SUBπCLOSE:IF S=171AND B&=Z&THEN?" :) Ok!"ELSE?" :( Bad!πSUB U(A$):FOR A=1TO LEN(A$):C=ASC(MID$(A$,A))-37:IF C<0THEN C=91+C*32πIF K<4THEN K=C+243ELSE?#1,CHR$(C+(K MOD 3)*86);:K=K\3:B&=B&+1πS=(S+C)AND 255:NEXT:LOCATE,1:?STRING$(B&*50\Z&,219);:END SUBπAndrew L. Ayers                EXPLOSIONS EFFECT              andrewa@indirect.com           10-22-96 (00:00)       QB, QBasic, PDS        76   1630     EXPLOSNS.BAS'π' Description : Explosions - VGA mode 13 special effectπ' Written by  : Andrew L. Ayersπ' Date        : 10/22/96π'π' The name says it all!π'π' You may use this routine in any manner you like, as longπ' as you give credit in an appropriate manner. Have phun!π'πSCREEN 13π'π' Set up arrays for our explosion dataπ'πDIM x(50), y(50), xv(50), yv(50), ox(50), oy(50)π'πDOπ  'π  ' Initialize an explosionπ  'π  FOR t% = 0 TO 50π    x(t%) = 0π    y(t%) = 0π    dir = RND * 6.28: vel = INT(RND * 5) + 1π    xv(t%) = SIN(dir) * velπ    yv(t%) = COS(dir) * velπ  NEXT t%π  'π  ' Initialize offsets and colorπ  'π  tx% = INT(RND * 320)π  ty% = INT(RND * 200)π  c% = 31: done% = 0π  'π  ' Print the titleπ  'π  LOCATE 1, 6: PRINT "Explosions by Andrew L. Ayers"π  LOCATE 23, 8: PRINT "Press any key to exit demo"π  'π  ' Explode!π  'π  DOπ    'π    ' Move all the piecesπ    'π    FOR t% = 0 TO 50π      'π      ' Erase an old pieceπ      'π      LINE (ox(t%) + tx%, oy(t%) + ty%)-(x(t%) + tx%, y(t%) + ty%), 0π      ox(t%) = x(t%): oy(t%) = y(t%)π      'π      ' Move the pieceπ      'π      x(t%) = x(t%) + xv(t%)π      y(t%) = y(t%) + yv(t%)π      'π      ' Draw it at new positionπ      'π      LINE -(x(t%) + tx%, y(t%) + ty%), c%π      'π    NEXTπ    'π    ' Decrement color to "fade"π    'π    c% = c% - 1: IF c% < 16 THEN done% = 1 ' Do another explosion if doneπ    'π    IF INKEY$ <> "" THEN done% = 2 ' Exit on any key pressπ    'π    FOR dlay = 1 TO 5000: NEXT dlay ' Change to suit your machineπ    'π  LOOP UNTIL done%π  'πLOOP UNTIL done% = 2π'πCLSπAndrew L. Ayers                FAST & SMOOTH SCROLLING EFFECT andrewa@indirect.com           09-10-96 (00:00)       QB, QBasic, PDS        89   2012     GETSHIFT.BAS'π' Description : GetShift - Mode 13 VGA Special Effect Routineπ' Written by  : Andrew L. Ayersπ' Date        : 09/10/96π'π' This shows off one hell of a way to achieve a very smooth and fast "scroll"π' type effect which may be useful in a game or demo. The technique I use toπ' do the effect is to shift the data within the GET buffer, re-displaying itπ' each time using the PSET operator. By keeping the buffer small, I can doπ' the shifting relatively fast, then copy the shifted version over and overπ' again on the screen to create a full screen scroll type effect!π'π' As always, if you use this in any of your creations, please consider yourπ' source and mention my name. Thanx, and have phun!π'πDIM a%(451), save%(24)π'πSCREEN 13π'π' Build our imageπ'πFOR t% = 15 TO 0 STEP -1π  'π  col% = 31 - (t% * 2)π  CIRCLE (15, 0), t%, col%π  PAINT (15, 0), col%π  'π  CIRCLE (15, 29), t%, col%π  PAINT (15, 29), col%π  'π  CIRCLE (0, 15), t%, col%π  PAINT (0, 15), col%π  'π  CIRCLE (29, 15), t%, col%π  PAINT (29, 15), col%π  'πNEXTπ'π' Put it in the bufferπ'πGET (0, 0)-(29, 29), a%π'π' The following is info you might find helpfulπ'πdbyte% = a%(0)πhighbyte% = INT(dbyte% MOD 256)πlowbyte% = INT(dbyte% / 256)πwid% = INT(highbyte% / 8) ' Width of GET image in pixelsπ'πdbyte% = a%(1)πhighbyte% = INT(dbyte% MOD 256)πlowbyte% = INT(dbyte% / 256)πhgt% = highbyte% ' Height of GET image in linesπ'π' Clear off the screenπ'πCLSπ'πLOCATE 1, 3: PRINT "Smooth as Silk! - By Andrew L. Ayers"π'πDOπ  'π  ' Shift the buffer upπ  'π  FOR t% = 0 TO 14: save%(t%) = a%(2 + t%): NEXT ' Top lineπ  'π  ' Middle linesπ  'π  FOR t% = 17 TO 451π    'π    a%(t% - 15) = a%(t%)π    'π  NEXTπ  'π  FOR t% = 0 TO 14: a%(437 + t%) = save%(t%): NEXT ' Bottom lineπ  'π  ' Display it!π  'π  FOR y% = 0 TO 5π    'π    FOR x% = 0 TO 9π      'π      PUT (7 + x% * 30, 10 + y% * 30), a%, PSETπ      'π    NEXTπ    'π  NEXTπ  'πLOOP UNTIL INKEY$ <> ""πAndrew L. Ayers                QUADRATIC PLASMA               andrewa@indirect.com           10-23-96 (00:00)       QB, QBasic, PDS        148  3332     QPLASMA.BAS 'π' Description : Quadratic Plasmaπ' Written by  : Andrew L. Ayersπ' Date        : 10/23/96π'π' This is a program to create quadratic plasma (I am unsure onπ' the name here. I know I am not using quadratic equations, butπ' hey, call it what you want). The images are formed using onlyπ' math - no recursion, SIN/COS warping, or random numbers. Whatπ' comes out is a very nice display. On machines without a co-π' processor, this may take a little while. Have phun!π'πDECLARE SUB ReadRGB (red%, grn%, blu%, slot%)πDECLARE SUB WriteRGB (red%, grn%, blu%, slot%)πDECLARE SUB SetPal (start.slot%, end.slot%)π'πDIM oldr%(255), oldg%(255), oldb%(255)π'πSCREEN 13π'π' Save old paletteπ'πFOR t% = 0 TO 255π  CALL ReadRGB(oldr%(t%), oldg%(t%), oldb%(t%), t%)πNEXT t%π'π' Create a custom 63 color paletteπ'πCALL WriteRGB(63, 63, 63, 1)πCALL WriteRGB(63, 0, 0, 15)πCALL WriteRGB(0, 63, 0, 31)πCALL WriteRGB(0, 0, 63, 47)πCALL WriteRGB(63, 63, 63, 63)π'πCALL SetPal(1, 15)πCALL SetPal(15, 31)πCALL SetPal(31, 47)πCALL SetPal(47, 63)π'π' Display quadratic plasmaπ'π' Try different numbers (greater than 1) for scale!π'π'scale = 1π'scale = 10πscale = 100π'scale = 250π'πFOR y = -100 * scale TO 100 * scale STEP 1 * scaleπ  'π  h% = 0π  'π  FOR x = -160 * scale TO 160 * scale STEP 1 * scaleπ    'π    h% = h% + 1π    'π    ' Try out these equations for different effects!π    'π    c% = (SQR(x * x + y * y) AND 62) + 1π    'c% = ((SQR(x * x) + SQR(y * y)) AND 62) + 1π    'c% = (SQR(ABS(x * y) + ABS(x * y)) AND 62) + 1π    'c% = (SQR(ABS(x * x - y * y)) AND 62) + 1π    PSET (h%, v%), c%π  NEXTπ  'π  GOSUB MovePalette ' Remove this line if your machine lacks a coprocessorπ  v% = v% + 1π  'πNEXTπ'π' Move the palette for a cool effect!π'πDOπ  GOSUB MovePaletteπ  FOR delay = 1 TO 1000: NEXT delay' Adjust for your machineπLOOP UNTIL INKEY$ <> ""π'πCLSπ'π' Reset original RGB valuesπ'πFOR t% = 0 TO 255π  CALL WriteRGB(oldr%(t%), oldg%(t%), oldb%(t%), t%)πNEXT t%π'πSTOPπ'πMovePalette:π  'π  CALL ReadRGB(ored%, ogrn%, oblu%, 1)π  'π  FOR t% = 1 TO 62π    CALL ReadRGB(red%, grn%, blu%, t% + 1)π    CALL WriteRGB(red%, grn%, blu%, t%)π  NEXTπ  'π  CALL WriteRGB(ored%, ogrn%, oblu%, 63)π  'πRETURNππSUB ReadRGB (red%, grn%, blu%, slot%)π  'π  OUT &H3C7, slot% ' Read RGB values from slotπ  'π  red% = INP(&H3C9)π  grn% = INP(&H3C9)π  blu% = INP(&H3C9)π  'πEND SUBππSUB SetPal (start.slot%, end.slot%)π  'π  num.slots% = end.slot% - start.slot%π  'π  CALL ReadRGB(sr%, sg%, sb%, start.slot%)π  CALL ReadRGB(er%, eg%, eb%, end.slot%)π  'π  rr% = ABS(er% - sr%): rg% = ABS(eg% - sg%): rb% = ABS(eb% - sb%)π  rs% = SGN(er% - sr%): gs% = SGN(eg% - sg%): bs% = SGN(eb% - sb%)π  'π  stepr = (rr% / num.slots%) * rs%π  stepg = (rg% / num.slots%) * gs%π  stepb = (rb% / num.slots%) * bs%π  'π  r = sr%: g = sg%: b = sb%π  wr% = r: wg% = g: wb% = bπ  'π  FOR t% = start.slot% TO end.slot%π    'π    CALL WriteRGB(wr%, wg%, wb%, t%)π    'π    r = r + stepr: wr% = rπ    g = g + stepg: wg% = gπ    b = b + stepb: wb% = bπ    'π  NEXT t%π  'πEND SUBππSUB WriteRGB (red%, grn%, blu%, slot%)π  'π  OUT &H3C8, slot% ' Write RGB values to slotπ  'π  OUT &H3C9, red%π  OUT &H3C9, grn%π  OUT &H3C9, blu%π  'πEND SUBπAndrew L. Ayers                EXPLODING PIECES EFFECT        andrewa@indirect.com           09-12-96 (00:00)       QB, QBasic, PDS        146  3518     EXPLTRI.BAS 'π' Description : Exploding Pieces - Special Effect Routineπ' Written by  : Andrew L. Ayersπ' Date        : 09/12/96π'π' This shows off a pretty CPU intensive "explosion" of coloredπ' triangles, all spinning and moving away from a common center atπ' different velocitys. Perhaps it could be modified to be used inπ' a game or something. I wrote it after reading a post on one ofπ' the newsgroups about someone needing to create an explosion -π' I hope this helps some...π'π' As always, if you use this in any of your creations, please consider yourπ' source and mention my name. Thanx, and have phun!π'πSCREEN 7, , 1, 0π'πCONST MAX.NUM = 60π'π' Define a triangleπ'πTYPE triangleπ  px1 AS INTEGERπ  py1 AS INTEGERπ  px2 AS INTEGERπ  py2 AS INTEGERπ  px3 AS INTEGERπ  py3 AS INTEGERπ  'π  nx1 AS INTEGERπ  ny1 AS INTEGERπ  nx2 AS INTEGERπ  ny2 AS INTEGERπ  nx3 AS INTEGERπ  ny3 AS INTEGERπ  'π  r AS INTEGERπ  'π  x AS INTEGERπ  y AS INTEGERπ  'π  vx AS INTEGERπ  vy AS INTEGERπEND TYPEπ'π' Set up a whole mess of 'emπ'πDIM pieces(MAX.NUM) AS triangleπ'π' Initialize themπ'πFOR t% = 0 TO MAX.NUMπ  'π  pieces(t%).px1 = 0: pieces(t%).py1 = -5π  pieces(t%).px2 = 5: pieces(t%).py2 = 5π  pieces(t%).px3 = -5: pieces(t%).py3 = 5π  'π  pieces(t%).nx1 = 0: pieces(t%).ny1 = -5π  pieces(t%).nx2 = 5: pieces(t%).ny2 = 5π  pieces(t%).nx3 = -5: pieces(t%).ny3 = 5π  'π  pieces(t%).r = INT(RND * 360)π  'π  pieces(t%).x = 160π  pieces(t%).y = 100π  'π  DOπ    'π    pieces(t%).vx = (INT(RND * 17) - 8)π    pieces(t%).vy = (INT(RND * 17) - 8)π    'π  LOOP UNTIL pieces(t%).vx <> 0 AND pieces(t%).vy <> 0π  'πNEXTπ'π' Build SIN/COS tables for speedπ'πDIM sintable(359), costable(359)π'πrad = (3.14159 * 2) / 360π'πFOR t% = 0 TO 359π  'π  sintable(t%) = SIN(t% * rad)π  costable(t%) = COS(t% * rad)π  'πNEXT t%π'πr% = 0π'π' Explode!π'πDOπ  'π  done% = 1π  'π  ' ERASE LAST IMAGEπ  'π  LINE (0, 0)-(319, 199), 0, BFπ  'π  FOR t% = 0 TO MAX.NUMπ    'π    IF pieces(t%).x >= 0 AND pieces(t%).x <= 319 AND pieces(t%).y >= 0 AND pieces(t%).y <= 199 THENπ      'π      ' CALCULATE POSITION OF NEW IMAGEπ      'π      lx1 = pieces(t%).px1 * sintable(r%) + pieces(t%).py1 * costable(r%)π      ly1 = pieces(t%).px1 * costable(r%) - pieces(t%).py1 * sintable(r%)π      lx2 = pieces(t%).px2 * sintable(r%) + pieces(t%).py2 * costable(r%)π      ly2 = pieces(t%).px2 * costable(r%) - pieces(t%).py2 * sintable(r%)π      lx3 = pieces(t%).px3 * sintable(r%) + pieces(t%).py3 * costable(r%)π      ly3 = pieces(t%).px3 * costable(r%) - pieces(t%).py3 * sintable(r%)π      'π      pieces(t%).nx1 = pieces(t%).x + lx1π      pieces(t%).ny1 = pieces(t%).y + ly1π      pieces(t%).nx2 = pieces(t%).x + lx2π      pieces(t%).ny2 = pieces(t%).y + ly2π      pieces(t%).nx3 = pieces(t%).x + lx3π      pieces(t%).ny3 = pieces(t%).y + ly3π      'π      ' DRAW NEW IMAGEπ      'π      c% = INT(RND * 16)π      'π      LINE (pieces(t%).nx1, pieces(t%).ny1)-(pieces(t%).nx2, pieces(t%).ny2), c%π      LINE -(pieces(t%).nx3, pieces(t%).ny3), c%π      LINE -(pieces(t%).nx1, pieces(t%).ny1), c%π      'π      PAINT (pieces(t%).x, pieces(t%).y), c%π      'π      pieces(t%).x = pieces(t%).x + pieces(t%).vxπ      pieces(t%).y = pieces(t%).y + pieces(t%).vyπ      'π      done% = 0π      'π    END IFπ    'π  NEXTπ  'π  r% = r% + 15: IF r% > 359 THEN r% = 0π  'π  ' SHOW IMAGE ON SCREENπ  'π  PCOPY 1, 0π  'πLOOP UNTIL done%πAndrew L. Ayers                OTHER NICE SPECIAL EFFECTS     andrewa@indirect.com           10-24-96 (15:12)       QB, QBasic, PDS        100  6558     EFFECTS.BAS DEFINT A-Z:DIM SHARED K,S,B&,Z&:V1 'Created by PostIt! 7.2πSUB V1:OPEN "O",1,"EFFECTS.ZIP",4^6:Z&=4644:?STRING$(50,177);πU"%up()%9%%%d-%b*.uF3H2=E,'7%%?)%%%1%%%%ns%yjwk%jwSg.fxDx;0>SUj5vπU"]=DNGhz./BQI\<>jTLIiu9CYey_58m2?b+)offAs%jNhFEaUfZCVuL>hVN4F6KiπU"S=l[bUbqjH5Yw/&Qu9q7bV>iK?-I$bUkljDq/'^.$54OV%Y61j[9C#Gc/?89:uxπU"Kb??hp)AGZGW=OBUD:;n0-D)Gjia\KN)oOgGfF[kv&4M[1TR[Ni,6Y,K/[gmw/JπU"JoJE]bVq[>*S%ekk&Ad'T4/.fOETFw*cxrBA6b%25;kKYzy6/\lu0*IcNS'?HmjπU"7,kpxHflfe/GnFME.#hm&dQ0S_g8i;8S.:9nEiTkh69aK8'w%rURt_K3F8aqB*:πU"TygOsH'Y3'1([uJU9S,o%KgxYylFrq0Zq3IVv9c^6couK.Y*;n,f=)p5[qH,kf(πU"/ZU?-sj'j6s14?dtYZGC>*zQc0jAB=.7<fg7RsS=RYM)]TK^b[6k7VWg7Y\sV=rπU"AQbZ[9qIU]h=nM\(a7Bj:gW8+*DDL#Rl:9m&;s/Og(Z1qZrOPn/I\lq3XO1#tg&πU":f9BKZ1fT9T.6-\$1<(sTdyi12?xO%p9K9bBPx<c]f-;=r[B5ze(ru(SKTkt3f.πU"fhvTwtvJs;]2d0I2\8WcG1+ofniuc5;6';Cf8_%ir%Qp*SQFe#WPJ$uN3qRRG(eπU"tb(%-D<s8UH<mMf$aNBjF-pdAt;^$>I[*cAMs3eCcx8;U4wnY8dTY/WBjHki;0fπU"mXGq_[>dI9bE207GYx;2FQ/>:K5R,ajF9mUVZ\JNu]a?Y%N-*-fOdu%p()9%%%%πU"-:%l*u%F&-N+B0+%+%k;%%%.%%%%qns(j)SgRfx6'2<Bjk=5wg>WxV&v3't)w.)πU"skmCxJka2XrxQo2'0Gdle6=C9R+_Y3kdJ;JF9B5W=8X]nIWeofbteZDf&K2EKC+πU"I\I#2;Nbsvd-hgrFFr',31Z%)o-0qlSE)_UH17BOcjmiU:9eJ[qt)1p-(Qtx17QπU"b&BV$/&sVR<%g,r[=7.(0x4'[6-lv:jw<^j:JG,:j:TfL)Y#m'[;21au>8Svuq:πU"RluV/LaPI'F''&K.*ShQg:L/t6)pLgZs:?q/6#7'f)9H&\EF)Eo:$TZ.6R_+UrnπU"=[?v0:6WGa30qt_jG*QKSRGulM1-Egfc==V1+V*V7(yB85qj92mN>.$g0&H'gkNπU"4Sg,):X.5(QmNk#thmewlEqNK0::eJl/,iWUk=J\Vh\/e+g4D2'7J-.5BhdPKzLπU"13G#m1dl/p(dbEo4tTy_L+hKVT7nKJO?<%aWS#S2[?BEZ)yfPxp_b>Ul-Y=m9QXπU"h2o\+'Y/<SkdlUn5LE20wp]'mr<P1;+52)n6+=:mZ13s&'^pY;SN:]I:,-vcKoWπU"8?$vPFiql9//as>PPgeZO1kqO\g8'j6/EFN?if-YEF_ibe1b088vqCp*zq-5t8JπU"l>pa,LRb$u(a9cYmaxX3u[T)8/GXuUTVdlS;6r\1.;8IC'&=R/XB#l%6$qP6g/FπU"utrMDuBzr.kX9r(?Jhc0ZA-.cO42+oS,nX.\w<&s+J*SX64((1Hoo$ne)SJUS7<πU"TsyCYE;;40r/'U<l<UiGpy_X'Mpnr6.d',&P$J(0<uFg7>WCv,&oPE^R_07JI]pπU"'CDgtg^#z<;f&e<<P)6+7?Z5;)hd-YxYu=3''<ddnqTVTNq;'&ppp:uKQCzGmX'πU"DZOq,si-x[:1^r02kTrR2hI#R:Zp_lKUG-_7Cj)or#7K:<B+Y/[^7<:hgEq7qAdπU")(K-Dv3)Q\BA_YJ4%,M?%%rF'sOk,(MPt-Gv>p?lk\bd_[b$jOa[Ux85ol-QYD=πU"bYIku1fY%kf9Pi/hhuLO9,-nCEx(c.JrqX=L6Ej59MfW\msUOctFHiJ5#:%0$KPπU"MM*u:p7%0mR^avtubhTr%;TKI0eY<5PJ-P%2;?QRfZkmut_kD7'_0$;t6YQglX1πU"f2uKdnCs-iD.&tVdy#>Xqhn%Ynp&ktja?I1.aNXG(rV&_%r*6g>;H>bybQE$OW#πU"4'6np)g<aUW9Z'GR0b7$6U('38Jz9-jmHqH$8#nYN?g#8A'OLn23?\TM'Gqju5,πU"Y_[#<fX-4idLZT4Lq'pOHV$vYWm)8I4.Y/Hc(0_G^\Vuiv:I:xN)42D(oKMITP-πU"\pz%'D1Gmpdi2M%[aJ.$Nrn$&#((ou^\t#MQJU$fi<KKE9(.2aSs5Q>7Vtm.]]fπU"Ne/Z06vc#Tu6qgl2=)Qj5$;pw=GB:&ah2'sCByJ,O%qA-bCZigioTym_A-YT+i7πU"]o^y,fNUPw+y3mA-YWasWnSZ2'so(2*cFpBZUng<757jx9q)25qQni*LY3l>-4FπU"qKTzC(>t78d6cmLF7F*_tbBBX0s[y.cmuz:y8YQfIzh)mwx%Btw)(1,pve\R_UwπU"N(b$1Wt6mK_N68'\KGmkV?2_8p:w8_:o'v?+Z2hBeaV86nhwc7r:bpuO&6Re(TLπU"WgpS*I0/-E?_AG0Cx\6t4oN=c+bsFwL4ze4O)OMOex7/(()nhA&02V:q2z-iUZ6πU"0&E5r)W(*V/:gC:4ZpzCJdhoI[0pbna\a(FStI2UU0<9*PcM=xr&=&tdwMx$#/MπU"nA+2SeeFnf=pG9V>(fbZ%sM0%AJ?gO3\*+yfn17Td'tD14,7MKrBT8Y%Vu^uqaQπU"qadNA56MZd,0Mr/CVHTG%k.t<5^Z.2v*+Q[[FOtpoDX;B6(+V^k9g-&(8w1_EMDπU"?j^X>w'Vk=3c0Hq=5=c1B03E<a%a]KVZsgZVJRDtM*4upuDfoS#O3lW2#IU?jVwπU"Z_2Wek*&[mbKnGgMNs(3b_ACM5sg$0B*<CPt7U%xo:1[kKnBsK?(H6Ac\9=HusAπU"'l/fBP^bGDXB(M#_g]xP_#aW)V7[+tY3j:rL42K?Pg?mTRKC;m4j<r4mQ%\s%YSπU"J&$4C6$3s/,1_LJqFRCx,F4s>WL7NH,=EGHmUR^<7Un3b*_=:mq?0kDZZLl0K?bπU"o'yhG:wo(^^=DCH\?,=lb5X*l7/6I80,(G(g2:6b)'Xv%,up(%)9%%[%-%6B*uFπU"$oc.w_#&%%[%)%%-%%%%x%unsS[gfx6kaV=Lde5Th+H^BsdHu)ZJs[txJ1fs_u1πU">;.Yr=u,c3G)(_?FHhkUM>H'%Buf[g67YL0JF5uGE0#lThEs;gbGP'*ZgnNq'<TπU"Jcy0OG*.KG1<GNX9^M^G.P6;[\c#QNBG-n%$vp7?5_=,2n%t^3/qbqF\uZz3_8nπU">;uZjZ2u$W^rGG=>j.q0pvZ.V)%;s4Xe1<9^q$Ou5k^XC$SFfGaRu6I]Y)=6Eq4πU"H),o,t7emIh:82gZ((;d9)lV*L?]a11j9s6e,)$R5#M9_VlK'\2)FfCewK+aF(MπU",qM?^/Ms[zA$WWZtY1l/h$_>s%P)\m352WL2S8,kx=WrYY92GtoBQ;$HTKe%5fDπU"EWRrN5pYFb>PGaHPlVgS,-_Yy%SG[x9J,S8?9JWg/]29*1\966<._uZXm3ZwNn-πU"8rXUGL2>Rt;^H[H^oa*W$>8=.(v%?qt?RMG_b=,alTPD+YS*\,\s.S5B*2CA7e9πU"?&pshT*3=6Rxo<PpE28pNOivM[oKt1m^Zis)jcY>:KX\e=^*<-b7u#:#mm\eWq%πU"-58$G+x\_Ikl$GhgTA*(oR*+WW#(glxxojAodeBQx*6^_=.=8[2cb:fD.IfCjljπU"zq=vTr%+up(%)9%%[%-%OB*uFpY40Ui%*%%z%2%%-%%%%k&(wjS#gfxlh%<BSmkπU"5wg4>xV2OxP_/h[[bQ&mIX=_2VN:k[:<kEjS;pskKJ4qbXsd-447'[qWrd8#9*TπU"oHcterWh\<;R21fm$XJK.j_TPc1F2;:.KK&kQPPXHh3U('[QwVQm$BkU^GIhnZwπU"]M7dq]A>uY$e,xVYU31Q00'3^?PHQCFcpd&I7XanSvqf>A<cGbG+J/<I4sfH$Y\πU"%?AGU;8m&JU;%Z57/Oic^)Ys7.F,]3H1??DAlfc(gw7)\<=N9=iL\.,26qU8DR;πU"kngl?3%2IuZK0u]Y2P\aQb%MkAOvQQPJ2Ay0(fPN_E]wM%;U:'8/bA=Nh0;qM$6πU"w'$0Seo.n\fuEns1ei##6>ORzP;+,9[g_M(loukcsO,UgCMw,=i(wB=%(y0?M.xπU"T6'KUeZ,IF&aQpI[WmeACT$RIT.]L86i5(>Lwq8qsv+M?/xyiEU,zF,PfsfTMwNπU"q9hXL[MO,F*i,.a]5esQEJ2a+Bh?SlMe,tm#JOo/V4-1dtt<#^L;\+P#F7yA$rnπU"WAFdFn#tc,bRwKNCsx*D3n-+%z1WH<s$^_YZ[YcCUH.5n7RL*&]$gZJ*U]?qH]JπU"]-p-MK85PDGon)<YUW%r%K?+YU[ITRqSqXch9_K<5Pga>UG$[ubT)?hqSn$c\,-πU"-./B%wrm1ubI2hOs'dLki6#I%c=wR.UdV%I#wng?'[Bd.h0cU/Ld]F7<*s0SfYQπU"AVWvk:\)>vA)jy15tF&&N[IE5D_3mCGO/zmc3'JP+o^iPPiD()<l3wO-F2dWL#oπU"3x:p$=j4vM[cjiMoqs>EKxpXcwq9UVBISVyMjmSys&NaLpm15eZQALFI=ls60peπU"p4b#):Ge:4aU,hiV/?MkSIsmQm\[mX[Ogw9*#G\j3wVqX.3*Y2p=lW''J6rd7Y7πU"&qRhGYIxVhrtI$5VgS[bW+h8d'o(xCO82V1xYw*+MN%5.:')yV_nV7Ld^3V:8bIπU"4.>Z(Pqpfdrv*fBQgOr6\r1k'x1R,YVQ42><m#T%nI?+Uc(hVI<(#XwpGZ[\k6xπU"cfv(1CHG4<PgWRFDHG%?KE4EK;0VP;'Pj#K-Lw=s4aoef=jQ$riwH0&BU%bEG]hπU",rG8vX8Up_(w\6]&/ga[=YIJz7+6:Yeh9XVGlp7%KS;J7\n&N/J5FZJ$IR;VcNVπU"m=j*_Nc4#_?Vsm+6*O$n.D%ICjJlo,A]I3UVKD2Gfq'aevWkeJ[F*ec3<q#rS/iπU"xkuxu,iolLXJ(+knNfH..pY0vhs,4,:gQ<6W.[y8asdTW+YjAC42'Ev/U2LfkFsπU"O#&TUI>#Q2(cdE>AW#R>U6MX%h+gE)zK+WfjT;h1v,gPjpI66X?^YjQ#vMVJJjlπU".NZ4j,M5'\uA&Mr8J(xb<^JQlOu:nhAD=YE]a)AsRCa_B3OunP.f8J>=]58D6<\πU"7_j=;/m>*xDTcig(MD9V,VI,dHJYdngxE(.dE)I>p4jv^3Y]eL:l:\m2F66R(J%πU"VO6Ak[?DG'69]SW+6]inJk;a;^=qCt+lvPHd)Qk25XgQ2R%M]>P&=O/'[zy_q=2πU"psCk<$o#K7*C<ZAZpAZwp8H=<)H3P8]Z^k_w\#*K%3%p'hl*sdN1<z.%L>81A=\πU"S:-+\OR1qN2V:m5WOZrK_4G9%s0Yb99p'*+].J4KU^.m\V7=cqtV7oV-D>eWR$^πU"2f_-]S\]*B4JKgP)'X?F$6W%wigX2LfO5GN1PlF3cWgz,Z[J%G%YPCrC^bOg/h>πU"GzpmA._Owqg;Y's;Yk-Z2wYMblFL=>l5qwEdR?owEDrx6#f;1BUItJt5jt&BfLZπU"/G2;QC:J5<[1Hqh+Hnb%dup&%'9%9%%%%-:%b*uCF3H=)E,'%+%?)%%%1%%%%%%πU"%%%&%E%%%%%%%%%n%syjw%kjwS%gfxu%p&'9%%9%%#%-%l'*uF&[-NB0[+%%k%;πU"%%.%%%%%%%%%&%%E%%(%V'%%%qns(j)Sg%fxup%&'9%%9%%%m-%6*duF$c=.w_&πU".%%[)%%%-%%%%%%%%%&%%E%%%&4.%%%xuns%Sgfx%up&'%9%9%%%%-%-O*uFqp4πU"0U&i*%%%z2%%%-%%%%%%%%%&%E%.%%#0#%%k(%wjSg%fxup%*+%%%%%)%7)%V%%πU"%%V6%%%%%πEND SUBπCLOSE:IF S=217AND B&=Z&THEN?" :) Ok!"ELSE?" :( Bad!πSUB U(A$):FOR A=1TO LEN(A$):C=ASC(MID$(A$,A))-37:IF C<0THEN C=91+C*32πIF K<4THEN K=C+243ELSE?#1,CHR$(C+(K MOD 3)*86);:K=K\3:B&=B&+1πS=(S+C)AND 255:NEXT:LOCATE,1:?STRING$(B&*50\Z&,219);:END SUBπRobert Seidel                  MELTING SNOWMAN                rseidel@ifk.uni-jena.de        10-25-96 (12:00)       QB, QBasic, PDS        84   2438     SUMMER.BAS  ' SUMMER.BAS - FREEWARE by Robert Seidel rseidel@ifk.uni-jena.deππ'  █████████████████████████████████████████████████████π' █                                                     █π' █ This file was found at Robert's HomePage !          █π' █                                                     █π' █ Come and visit me if you are interested in:         █π' █                                                     █π' █  PowerBASIC, QBASIC, POVRAY, POVLAB,                █π' █    FREE 3D Studio IPAS, PICTURES,                   █π' █      FREEWARE, GAME Levels                          █π' █        AND A LOT OF LINKS !                         █ π' █                                                     █π' █  http://www.uni-jena.de/~p6sepa/rshp.html  ___      █π' █                                           (o o)     █π' █                                       oOo ( O ) oOo █π'  █████████████████████████████████████████████████████πππDEFINT A-ZπDIM melt(2400)ππSCREEN 13πRANDOMIZE TIMERππFOR i = 0 TO 63 'Paletteπ  SetRGB i, 64 - i, 64 - i, 64 - i 'grauπ  SetRGB i + 64, i, 0, 0 'rotπ  SetRGB i + 128, 63, i, 0 'rot-orangeπNEXTππFOR i = 1 TO 50 'Schneeπ  LINE (0, i + 150)-(320, i + 150), iπNEXTππRenderCircle 160, 158, 50, 1, .8 'SchneemannkörperπRenderCircle 160, 95, 35, 1, .8πRenderCircle 160, 50, 25, 1, .8πRenderCircle 149, 45, 3, 58, 1.2 'AugenπRenderCircle 169, 46, 3, 58, 1.2πFOR i = 85 TO 205 STEP 25 'Knöpfeπ  RenderCircle 155 + RND * 2, i, 2, 50 + RND * 4, 1πNEXTπCIRCLE (160, 93), 40, 0, 1.2, 1.8 'MundπCIRCLE (160, 94), 40, 0, 1.2, 1.8πFOR i = 147 TO 177π  LINE (i, 9)-(i - 2, 32), i - 130 'HutπNEXTπLINE (135, 32)-(184, 34), 30πFOR x = 16 TO 1 STEP -1 'Naseπ  RenderCircle 142 + x, 59 - x / 2.5, x \ 4, 128 - x * 2, 1πNEXTππSLEEP 'Pauseππ'SCHMELZEFFEKT:πFOR i = 1 TO 4000 π  x = RND * 271π  y = RND * 150π  GET (x, y)-(x + 48, y + 48), meltπ  PUT (x, y + 1), melt, PSETπNEXT iππRenderCircle 160, 100, 60, 128, 1 'SonneπRenderCircle 140, 80, 7, 55, 1 'AugenπRenderCircle 180, 80, 7, 55, 1πCIRCLE (160, 80), 50, 60, 4, 5.5 'MundπCIRCLE (160, 88), 50, 60, 3.6, 5.8, 1.3ππSLEEP 'PauseππSUB RenderCircle (x, y, r, colstart, a!)π  FOR i = r TO 0 STEP -1π    CIRCLE (x, y), i, (colstart + i), , , a!π    PAINT (x, y), (colstart + i)π  NEXTπEND SUBππSUB SetRGB (Nr, r, g, b)π  OUT &H3C8, Nrπ  OUT &H3C9, rπ  OUT &H3C9, gπ  OUT &H3C9, bπEND SUBπMathew Robertson               BOUNCING WOODEN BALL           FidoNet QUIK_BAS Echo          10-21-96 (18:29)       QB, QBasic, PDS        61   4350     BOUNCE.BAS  'Here is a little graphics program I wipped up.  It is a simple bouncing ball.π'But the graphics are alot better then the plain old circle that most normalyπ'is used.  I used a raytraced wooden ball instead.  Just had to add a twist π'to it.ππDEFINT A-Z:DIM SHARED K,S,B&,Z&:V1 'Created by PostIt! 7.3bπSUB V1:OPEN "O",1,"BOUNCE1.ZIP",4^6:Z&=2820:?STRING$(50,177);πU"%up()%9%'%d-%e)%rFI/+oFJ)7%%E-%%%0%%%%gt%zshj%VSgfCxdz,,B[[9hL6Ux/?Kj40LJπU"(1hj,aR)EU'n/gK_&YE3fjW)TfX0*aa1Z187&c+*hKkVfR#heCDHa^pCBYrjV3u3=Ykt>Y;$VπU":e>)bP>V/.qk;:&B?Nq+7F(SVj\>?[cCtZEo=VKb+IC>DDegVOACbkXLF?TE#1TZhhuxa7D3*πU"+qba^IU'h[&HF?O[TvXuY-Hq-geFAvP9#JsY;C*q*Fs8jnV.*qST7>45?Gb296\/;5YpqJU%LπU"O7n2l,8Fm^'BK+Uk5J.)ZiaV0D_CN)kpOrvS'R(SH6R&39i.VZ$+g5:F8n&sa^1N*]1iejbbaπU"_bl57&JjPLW1jFX6slFOBV'D+BS:-y/Q9(5lSkD(c898*;_yRUc:E-/sY3PPoFk2rPRTUeLqTπU"6<ZEb2vM6DEZ4>&ld<mUv[5<%V\OKc7GJNa+lmZ#Lj;^4,V_KkR?ee>#\TdZpCQ-^#]FUk^E4πU"FLW9hwIDd/o)EA'7mSY49$/n-'<M.m50_LkjcH9QsUUJ:0/qYF\;m\V2u(*UZldEo*o[H+D3BπU"pT=I+W+#76W2Vn<w825>(Wcu?H4]aC_,?/iwncfM&KXD6RrJpwTVOlQ3X&PMJ;1nCmqBylv/GπU".VoH_/SlOC6J=8zMB*E5gXX_BwueP]U9+D+BS3ivSw:nCi\JSlJ[X%ip6P&j]oM*lUXw+h;QyπU"]:4#*RZG(O7*VP'JMiL$jkpe>/hv?ff,k%6f+7([/#jjCnqE]+I1JI:Gu-^aSJg-vob;rZHLKπU"wc[MpxSq2aqC*ix^U;D74L;SsoW][mBWn6[SS8dW7?dzn2*ct8n\ROr0Nph8d*6t^umr%hM?_πU";xuS1A:20n*^Ct*=-]zmQjEP#?FpK^'_.*,wZpgC+\wgBM,NSb&GA]<MWOfA4(ng4mFtV6,pZπU"oV2e8Ap=g/vKmW8*nBE3C9*<KuM^;*:AJvSBBCBpwY,))eY;\#;%sE$k,*+il+V/wxNqnRXjZπU"S7I4kX-x;s]8Ke#1F)?QH:>;:hi<Gm()b(cw)_IXJ2vQOiN[ox_..U>UUJINs9(WVDEQ[WCBqπU"q1f-Z7Gp*;17kHF3of;D%z[,Z8X7^]5i&In2h(io:fq1Smt2,tfC/eNnt2D)6q&'o3Ji1pEdlπU"hA%zo_I(X&[VCZiKFrQjhk*_L=tmv^<7Od;ml)*gm$Bl#Ov=C##,[Lz>Vn2%p87%SX&_Kzqr.πU"KcJ,cI*%rI#*db.p*H*__f/k#H*zKAtEd%G_8v?:1?r33Y*LLjA#6hC%Y#riaj#B\GVYOW<YTπU"Bhmx_t>uVUC-$s-[p#^,RFX7tfJbl'6R3D_vOsp:z$qjJ>(dS?C4m/8[Q?L$('q<up%()9%%'πU"%-%)GdrF.ny$\'H'%%&M7%%%.%%%&&tti%VSufLq4d*-'TU1F*x0CL4-QHsi6O8*+);HTBBY-πU"gEkg=jIrgdu7OXXLdf,&WVbWxr?c'DK-l.2gB2m\OiH+mWPH8,Z$1W=lHdEEsb_rECUHI30#8πU"5&Kk47R]QnfSgG^tKE$hA3#dx3a>.kQOPN/)_c6N4k5=bmI\k+>C6fUa3CWnnbCA*C3R_2k+OπU"rp6zgqA;NLE8$EV_H$#ms_0?KtT(*TB3k=G\bJHt$$6]An$C3HXB,hn*JA7Ix\H=j2KQ-1jUBπU"^HhqB3WV#T3k=2Q%d$ckd$$],RbFkK*:zQe$qDaqo(,8,nmT>Gv<5khr<_%/E<dAOI*tAs,/HπU"T64JqjmZH\lDfgp_L2LsA+=L,hFIq_D2Ug,HNLokq'lbAJIt[snfomBdA5;bRqGH<Rd*TnElhπU"g;3>naE^lcVL_pjH(<^n\*zfoXX<2MVW.dfO3k;[TH;xR^9_/KXesxs'VE+G8_)[EM?=?=M?=πU"?=k?g?gk?g?gk?g?gk?g?gk?g?g>?/tK%WG6J7GLCi)Tw7ZaGS#fG\okJtr6JW;7>-\TS#f\WπU"oq67jTSZo5q67TWSZoqN67n7Mn7n7Mn7n7Mn7n7Mn7n7qn7h-bFS$fGlosJtv6LWY8h-FWS6SπU"6WS6S6WS6S6WS6S6WS6S69S<S<9S<S<9S<S<9S<S<9S<S<WS&S&WS&S&rS&S,5x?w?Vz9Eyr*πU"z?)4?D9qtz*&?T1?d9rEz*(-?9?0n:q%*?*?A?pP:E%u*,?I.?p:qZ&*.1Y:>OY0&:*Pi/%;&πU"rQ)*.q1:>OGY&:*OP/%;l&Q)*i.1:><OY&:S*P/%Y;&Q)Q*.1:l>OY&^:*P/q%;&QY)*.1Y:>πU"OY0&:*Pi/%;&rQ)*.q1:>OGY&:*OP/%;l&Q)*i.1:><OY&:S*P/%Y;&Q)>p.x%%up()%9%'%RπU"-%4d.rFYH:$vU'[%%,s%%%.%.%%&t%tiVS\%lfffSpz\[[%eZ+5'D'.8)Q-\Sf0B.0.3i8R[*πU".p[g:EuuBwGCgp\F]Lw=[a1V9G7<mo,U$IwH6svC_iv#IDa4u0v6wlMzY>fYV=Ebp0-v-VV3tπU"+u7tKeape-dts=56lF&sWRJMcYM>*mbw4PRl0)_vA#LN-\TMl#tD+*PEM^f$W<TK7q2(qQtX:πU"eMg8\G1mFcEbmwiPe&[*a5m$ME(eo(BdqS05)0<RUN<tCS*bv]Bm$0xMI:U+AAmNdP4TfA8*CπU"bDs&bnl\MgM&ceiZsMe8,uZTfwLT4docNbFs.DvsBk_DH3drm<XpSJNDmgCzfm>JRhhpmx.*XπU"^#Y,7-NVDWT-C%-CXTUr6MS(m;<&EUU'dBMgf<,[DJbo,k/A'Wv-ozBSso:V\Z2SgaeDTl0t>πU"L/Cp*CZbp3.0PnLZUSI$KXADqkX*'Hx^qgBv>]58okxW)\qBkD5l'lgC5kLihYsXDMOrT,sM%πU"IWRlt]lHfdWU$n3_Kh?9lP-qxsOo_9LS2NEB#pNE0k+l/mJVN(<3vB-W[)Wdkp#qiZHRt\JJhπU"kD8BTB-wo<$.#F?Pk,FpRi\s/YJs6-tN-.15Cc:2YK.G(1<BCVN17UeSM,sl2T_lYoHj)n,.<πU"m3ZglT9lO8VoQ(SuHQ7:),u..ode^UiHNX]MVTotduI6g-ck%cI.r<?.6ub.gQox$Oh2r<)FqπU"scCm3OgzziO7tQf8dIwTjvN\Ba_Nn;^ocdLd)EkOD6#M_(&rT\XsmR88N^js/GXWWbF'il/biπU"DJBMMEA;^dNulw:25ycy6&q6rxqBN\P0g4LyqDL[ws5p(a%ld%%%%%%%%%%%%%%%%%%%%%%%%πU"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%[%%%wπU"-pw'u%p&'9%%9%'#%-%e')rFI7/oFJ[)%%E%-%%0%%%%%%%%%&%%E%%%%%%%%%gtz%shjV%SgπU"fx%up&'%9%9%%'%-%)GdrF.ny$\'H'%%&M7%%%.%%%%%%%%%&%E%%%%s).%%&t%tiVS%ufqu%πU"p&'9%%9%'[%-%4AdrFYdH$vU%'%%,'s%%.%%%%%%%%%&%%E%%%%i,%(%&tt#iVS%%lfup%*+%πU"%%%%(%.(%v%%%%l/%%%%%πEND SUBπCLOSE:IF S=90AND B&=Z&THEN?" :) Ok!"ELSE?" :( Bad!πSUB U(A$):FOR A=1TO LEN(A$):C=ASC(MID$(A$,A))-37:IF C<0THEN C=91+C*32πIF K<4THEN K=C+243ELSE?#1,CHR$(C+(K MOD 3)*86);:K=K\3:B&=B&+1πS=(S+C)AND 255:NEXT:LOCATE,1:?STRING$(B&*50\Z&,219);:END SUBπKurt Kuzba                     VIEW CONTENTS OF RAM           FidoNet QUIK_BAS Echo          02-21-96 (00:00)       QB, QBasic, PDS        93   4299     QBMEMV.BAS  '>>   The segment before BIOS holds the interrupt vectors,π'>   So 0000:0000 is the first byte in memory, then fromπ'>   there, the pointers are placed for the ISR's, eachπ'>   pointer requiring 4 bytes.  That would put the end ofπ'>   the last pointer at 0000:0400, which is 1k (or 1024π'>   bytes) of memory used for storing pointers.  Whatπ'>   starts at 0000:0401 and what's after that?π'>.............π'   The interrupt vectors actually extend from 0000:0000 toπ'0000:03ff, or 0030:00ff. This allows for 256 interrupts.π'You should recognize DEF SEG = &H40 as setting to the BIOSπ'area segment. Here you will find all the parameters forπ'your current system configuration, such as address for theπ'COM ports and PRN ports, your keyboard buffer, cursor x andπ'y position definitions, shift status register, color statusπ'register, screen mode register, BIOS clock, and so on.π'After that?? Have you ever seen my posting of QBMEMV.BAS?π'It will allow you to peek into these areas and see what isπ'going on in there. I believe the next portion is also setπ'aside for SYSTEM usage, at least in DOS.ππ'_|_|_|   QBMEMV.BASπ'_|_|_|   This program allows the user to view the contents ofπ'_|_|_|   their system's RAM, up to 1 Megabyte.π'_|_|_|   No guarantees or warrantees are given or implied.π'_|_|_|   Released to   PUBLIC DOMAIN   by Kurt Kuzba.  (2/21/96)πCOLOR 4, 0: CLS : f$ = CHR$(178): DIM BMem(256) AS STRING * 1πPRINT : PRINT "  QUICKBASIC": PRINT : PRINT "   MEMVIEW": COLOR 10πFOR t% = 1 TO 6: LOCATE t%, 16: PRINT STRING$(49, f$): NEXTπCOLOR 14, 5: LOCATE 2, 4, 0πLOCATE , 19: PRINT " Cursor    UP  +256 "πLOCATE , 19: PRINT " Cursor  DOWN  -256 "πLOCATE , 19: PRINT " Cursor RIGHT  +4 K "πLOCATE , 19: PRINT " Cursor  LEFT  -4 K ": LOCATE 2πLOCATE , 42: PRINT " Page     UP  +64 K "πLOCATE , 42: PRINT " Page   DOWN  -64 K "πLOCATE , 42: PRINT " RETURN to EXIT     "πLOCATE , 42: PRINT " ESCAPE to EXIT     ": COLOR 10, 2πFOR t% = 7 TO 25: LOCATE t%, 2: PRINT STRING$(77, f$); : NEXTπLOCATE 8, 4: COLOR 1, 3: PRINT "       ";πFOR t% = 0 TO 15: PRINT RIGHT$("0" + HEX$(t%), 2); " "; : NEXTπCOLOR 15, 1: CurSeg& = &H0πFOR t% = 0 TO 15: LOCATE 9 + t%, 10: PRINT SPACE$(49); : NEXTπDOππ   FOR t% = 0 TO 15π      COLOR 1, 3: LOCATE 9 + t%, 4ππ      'Was: PRINT(RIGHT$("0000" + HEX$(CurSeg&),4); HEX$(t%); ":";π      'Corrected by Richard Backus 9/18/96 to correct the linear addressingπ      'on left column.ππ      PRINT LEFT$(RIGHT$("0000" + HEX$(CurSeg&), 4), 3); HEX$(t%); "0:";π      DEF SEG = CurSeg&: COLOR 15, 1: PRINT " ";ππ      FOR byte% = 0 TO 15π         PRINT RIGHT$("0" + HEX$(PEEK(t% * 16 + byte%)) + " ", 3);π      NEXTπ   NEXT: COLOR 0, 7π   FOR t% = 9 TO 24: LOCATE t%, 61: PRINT SPACE$(16); : NEXTπ   COLOR 15, 1π   DOπ      DEF SEG = CurSeg&π      FOR t% = 0 TO 15: FOR byte% = 0 TO 15π         BMem(t% * 16 + byte%) = CHR$(PEEK(t% * 16 + byte%))π      NEXT: NEXT: DEF SEG = &HB800π      FOR t% = 0 TO 15: LOCATE t% + 9, 11: FOR byte% = 0 TO 15π         PRINT RIGHT$("0" + HEX$(ASC(BMem(t% * 16 + byte%))) + " ", 3);π         POKE 1400 + t% * 160 + byte% * 2, ASC(BMem(t% * 16 + byte%))π      NEXT: NEXTπ      Key$ = INKEY$: IF Key$ = "" THEN Key$ = " "π      K% = ASC(Key$): IF K% = 0 THEN K% = -ASC(MID$(Key$, 2))π      SELECT CASE K%π         CASE -72: CurSeg& = CurSeg& - 16: Key$ = "LOOP"π            IF CurSeg& < 0 THEN CurSeg& = 65535π         CASE -80: CurSeg& = CurSeg& + 16: Key$ = "LOOP"π            IF CurSeg& > 65535 THEN CurSeg& = 0π         CASE -75: CurSeg& = CurSeg& - 256: Key$ = "LOOP"π            IF CurSeg& < 0 THEN CurSeg& = 65535π         CASE -77: CurSeg& = CurSeg& + 256: Key$ = "LOOP"π            IF CurSeg& > 65535 THEN CurSeg& = 0π         CASE -73: CurSeg& = CurSeg& - 4096: Key$ = "LOOP"π            IF CurSeg& < 0 THEN CurSeg& = 65535π         CASE -81: CurSeg& = CurSeg& + 4096: Key$ = "LOOP"π            IF CurSeg& > 65535 THEN CurSeg& = 0π         CASE 13, 27: out$ = "OUT": Key$ = "LOOP"π      END SELECTπ   LOOP WHILE Key$ <> "LOOP"πLOOP WHILE out$ <> "OUT"πCOLOR 14, 0: LOCATE 2, 67: PRINT "Thank You"πLOCATE 3, 67: PRINT "for using": LOCATE 4, 67: PRINT "QuickBasic"πLOCATE 5, 67: PRINT "MemView.": LOCATE 24, 1π'_|_|_|   end   QBMEMV.BASπCharles Godard                 PICK LIST DEMO                 FidoNet QUIK_BAS Echo          10-13-96 (12:20)       QB, PDS                182  5336     PICKLIST.BAS' >Anyone out there have any code examples for a pick list box ? Mouse supportπ' >would be a welcome addtion :)π'π'Here is one I've been working on, off and on.  It's not polishedπ'and I haven't started programming with the mouse yet, but maybeπ'you can polish it up and use it.π'                              Picklist.basπ'                           By Charles Godardπ'                               10/12/96πDEFINT A-Zπ'$INCLUDE: 'qb.bi'   'give it a path to qb.biπDIM SHARED Inreg AS regtypex, outreg AS regtypexπ TYPE BoxTypeπ  Char AS STRING * 1π  Attr AS STRING * 1π END TYPEπ TYPE boxParametersπ  scrn AS INTEGERπ  Tr AS INTEGERπ  Br AS INTEGERπ  Lc AS INTEGERπ  Rc AS INTEGERπ END TYPEπCOMMON SHARED Box() AS BoxType, bp AS boxParametersπ'***Duplicate the common shared and TYPE def when calling from another***π'***program module.  Exact duplicates are advised! ...................***πSCREEN 0πCLSπCOLOR &H7, &H9: FOR i = 0 TO 999: PRINT CHR$(3); " "; : NEXTπDIM Item(8)  AS STRING   'dim to only as many itemsπItem(0) = "  Zero   "     'as you will use in listπItem(1) = "  One    "πItem(2) = "  Two    ": Item(3) = "  Three  "πItem(4) = "  Four   ": Item(5) = "  Five   "πItem(6) = "  Six    ": Item(7) = "  Seven  "πItem(8) = "  Eight  "πSelected% = Picklist(10, 35, 8, 3, Item())πCOLOR &H1EπLOCATE 12, 31: PRINT "You selected Item: "; Selected%πCOLOR &HEπSLEEPππSUB ClosePicklistπ     scrn = bp.scrnπ     Tr = bp.Trπ     Br = bp.Brπ     Lc = bp.Lcπ     Rc = bp.Rcπ FOR x = Tr TO Brπ FOR y = Lc TO Rcπ  LOCATE x, y:π  fg = ASC(Box(x, y).Attr) AND &HFπ  bg = (ASC(Box(x, y).Attr) \ &H10)π  COLOR fg, bgπ  PRINT Box(x, y).Charπ NEXT y, xπscrn = scrn - 1πEND SUBππ'Waits for a sinlge keystroke and returns the function keys as aπ'minus numberπFUNCTION GetKey%π     Inreg.ax = &H0π     INTERRUPTX &H16, Inreg, outregπ LoVal% = outreg.ax AND &HFF  'returns Lo byte as ascii keys + #π          'hi-byte as - # (function keys)π IF LoVal% = 0 THENπ  GetKey% = -(outreg.ax AND &HFF00) \ &H100π ELSEπ  GetKey% = outreg.ax AND &HFFπ END IFπEND FUNCTIONππFUNCTION Picklist% (Tr%, Lc%, W%, H%, Item() AS STRING)πLines = UBOUND(Item)πIF H > Lines THEN H = LinesπBr = Tr + H: Rc = Lc + WπQBasicPU Tr, Br, Lc, Rc, &H34, "Choose"πoffset = 1:πScroll 0, Tr - 1, Br - 1, Lc - 1, Rc - 1, &H17, Br - Tr + 1π FOR Ct = 0 TO Hπ  IF Ct < Br - Tr + 1 THEN   'scrolls upπ   Scroll 0, Tr - 1, Br - 1, Lc - 1, Rc - 1, &H17, 1π   LOCATE Br, Lcπ   COLOR &H7, 4π   PRINT Item(E%);π  END IFπ  E% = E% + 1π NEXTπ   'hi-lite the 1st lineπ   Ct = 0  'reset it for reuseπ   LOCATE Tr, Lc: COLOR &HF, 4π   PRINT MID$(Item(Ct), offset, W%)π   IF bxRow < Tr THEN bxRow = TrππDOπ   KeyP% = GetKey%π   SELECT CASE KeyP%π     CASE IS = 13, 32π        Selected% = Ctπ        LOCATE 10, 1π        'PRINT Selected%π        Picklist = Selected%π        ClosePicklistπ        EXIT FUNCTIONπ     CASE IS = -80 'arrow Dn     SCROLL THE COMMANDSπ        Ct = Ct + 1  'keeps track of the elementπ        IF Ct > Lines THEN   ' limits # of variables to # ofπ          Ct = Lines     ' lines in file.π        ELSEπ          IF bxRow < Tr THEN bxRow = Tr  'sets top limit ofπ          bxRow = bxRow + 1               'where scroll beginsπ          'scrolls PRINTING down the 1st pageπ          IF bxRow < Br + 1 THENπ            LOCATE bxRow, Lc: COLOR &HF, 4π            PRINT MID$(Item(Ct), offset, W%)π            LOCATE bxRow - 1, Lc: COLOR &H7, 4π            PRINT MID$(Item(Ct - 1), offset, W%)π          ELSEπ            'scrolls SCREEN UP prints to Bottom line on the 2nd pageπ            'colors the last lineπ            LOCATE Br, Lc: COLOR 7, 4π            PRINT MID$(Item(Ct - 1), offset, W%)π            Scroll 0, Tr - 1, Br - 1, Lc - 1, Rc - 1, &H17, 1π            LOCATE Br, Lc: COLOR &HF, 4π            PRINT MID$(Item(Ct), offset, W% + 1)π            IF bxRow > Br THEN bxRow = Brπ          END IFπ        END IFπ     CASE IS = -72       'arrrow Up   π        'scrolls SCREEN DN prints to the top line of 1st pageπ        IF (bxRow <= Tr) AND Ct >= 1 THENπ          bxRow = bxRow - 1: Ct = Ct - 1π          LOCATE Tr, Lc: COLOR &H7, 4π          PRINT MID$(Item(Ct + 1), offset, W%)π          Scroll 1, Tr - 1, Br - 1, Lc - 1, Rc - 1, &H17, 1π          LOCATE Tr, Lc: COLOR &HF, 4π          PRINT MID$(Item(Ct), offset, W% + 1)π        ELSEπ          'scrolls PRINTING UP the page when not on 1st lineπ          IF Ct >= 1 THENπ            bxRow = bxRow - 1: Ct = Ct - 1π            LOCATE bxRow, Lc: COLOR &HF, 4π            PRINT MID$(Item(Ct), offset, W%)π            LOCATE bxRow + 1, Lc: COLOR &H7, 4π            PRINT MID$(Item(Ct + 1), offset, W%)π          END IFπ        END IFπ   END SELECTπLOOP UNTIL KeyP% = 27πClosePicklistπEND FUNCTIONππSUB QBasicPU (Tr%, Br%, Lc%, Rc%, Attr%, Title$)π bp.scrn = bp.scrn + 1π bp.Tr = Trπ bp.Br = Brπ bp.Lc = Lcπ bp.Rc = RcπREDIM Box(Br, Rc)  AS BoxTypeπ FOR x = Tr TO Brπ FOR y = Lc TO Rcπ  Box(x, y).Attr = CHR$(SCREEN(x, y, 1))π  Box(x, y).Char = CHR$(SCREEN(x, y))π NEXT y, xπ bg = Attr AND &HF: fg = Attr \ &H10π COLOR fg, bgπ FOR x = Tr TO Brπ  LOCATE x, Lc, 0π  PRINT STRING$(Rc - Lc, CHR$(32))π NEXT xπEND SUBππSUB Scroll (dir%, upperRow, lowerRow, leftCol, rightCol, Attr%, Lines%)πIF dir% = 0 THEN dir% = &H6 ELSE dir% = &H7π'6 is up   :      7 is downπ Inreg.ax = (dir% * &H100) + Lines%π Inreg.bx = Attr% * &H100π Inreg.cx = (upperRow * &H100) + leftColπ Inreg.dx = (lowerRow * &H100) + rightColπ INTERRUPTX &H10, Inreg, outreg   'no returnπEND SUBπNicolas Culberson              MOUSE DRIVEN TRIANGLE          exnihilo@rhunebbs.com          10-29-96 (00:06)       QB, PDS                136  5551     TRIMOUS.BAS 'Ok... this program doesn't ACTUALLY do anything.  It's the result of a lackπ'of INTERNET connection combined with boredom and visiting relatives youπ'don't want to know you are home.π'You need a mouse... a computer... some memory... a little hard-drive...π'patience... boredom... the default library... the real QUICKBASIC.π'Load up QuickBASIC by typing "QB/L" this loads the default library...π'You can use this however you like... I really don't care...π'If you make money off of it... pay me... I'm broke.π'If you at least bother to look at it...π'send me an e-mail...π'exnihilo@rhunebbs.com.π'Send me the latest ABC packet.π'Send me your funky code.π'Send me a life.π'All code by NICOLAS CULBERSON.π'This program intentionally bounces around like that!  Oh yeah, and it wasπ'created on a 486/33 so if it doesn't work right on your computer don'tπ'tell me about it.  I don't care.ππDECLARE SUB warp ()         'Declare stuff...πDECLARE SUB right ()        'Declare stuff...πDECLARE SUB down ()         'Declare stuff...πDECLARE SUB up ()           'Declare stuff...πDECLARE SUB left ()         'Declare stuff...πDECLARE SUB shoot ()        'Declare stuff...πREM $INCLUDE: 'QB.BI'       'Include the library thing...πDIM SHARED regx  AS RegTypeX'Dim regx as regtypex and share it between theπ                'subs(see "Declare stuff...")πDIM SHARED a, b             'Do the same thing with the variables a,bπRANDOMIZE TIMER             'This Randomizes the computer timer(duh)ππCLS                         'Clear the screen.  If you don't understand thisπ                'statement... don't bother trying to figure theπ                'program out.  You need a manual.πSCREEN 13                   'Put the screen into 320 * 200 graphics mode.πa = regx.cx / 2             'Define the variable regx.cxπ                '(the X AXIS on the mouse) as variable named a.π                'You must divide by half in screen 13.πb = regx.dx                 'Do the same thing to the variable named b withπ                'the Y AXISπDO                          'Begin LOOP(see LOOP)πa$ = INKEY$                 'Look for a keypress and place it in STRING A$πIF a$ = CHR$(27) THEN END   'If the key pressed is "esc" then escape.(pleaseπ                '(note:  this is high level programming, do notπ                'attempt to put such wonderful features in yourπ                'own programs without adult supervision.)πregx.ax = 2                 'Hide the mouse cursorπCALL INTERRUPTX(&H33, regx, regx) 'Call the mouse interrupt at the addressπ                  '&H33... this works on most computers...πregx.ax = 3                       'I dunno what this does but it has to beπ                  'there last time I checked.πCALL INTERRUPTX(&H33, regx, regx) 'Call it again.πREM IF regx.dx > 139 THEN regx.dx = regx.dx - 1 'This line is remmed...π                        'ignore it.πIF a > regx.cx / 2 THEN CALL left  'Call the sub LEFT if the mouseπ                   'moves in the left direction.πIF a < regx.cx / 2 THEN CALL right 'Call the sub RIGHT if the mouseπ                   'moves in the right direction.πIF b > regx.dx THEN CALL up        'Call the sub UP if the mouseπ                   'moves in the UP direction.πIF b < regx.dx THEN CALL down      'Bear with me here... things do change.πIF regx.bx = 1 THEN CALL shoot     'Regx.bx is the mouse button variable.π                   '.bx=1 is button number 1π                   '.bx=2 is button number 2π                   '.bx=3 is button number 1 and 2 at theπ                   'same time or button 3 if you have it, Iπ                   'think.π                   'So, this line checks for button 1...π                   'and if it is pressed, calls the subπ                   'named shoot.πIF regx.bx = 2 THEN CALL warp      'If button 2 is pressed...π                   'call the WARP sub.πLOOP UNTIL bob = 1                 'Loop forever.  Whose BOB?πππ'Hmmm... you're still reading eh?  Your internet connection must be down too.π'How about calling Zeitgeist BBS in Saint John... the phone number isπ'(506)832-9012 or something like that.  Experiment... you never know who youπ'might get.  When you get there... e-mail Ex Nihilo, or Beanpole, orπ'Ebenezer. ππSUB downπPSET (a, b), 0               'Delete the old oneπDRAW "e10f10l20"             'by drawing over top of it in black.πb = b + 1                    'Move the picture down 1.πPSET (a, b), 12              'Redraw it.πDRAW "e10f10l20"             '  "    " .πPAINT (a + 3, b - 1), 14, 12 'Paint the yellow inside.πEND SUB 'End the Sub(pretty self explanatory)ππSUB leftπPSET (a, b), 0   'See SUB DOWN... it's the same thing.πDRAW "e10f10l20"πa = a - 1πPSET (a, b), 12πDRAW "e10f10l20"πPAINT (a + 3, b - 1), 14, 12πEND SUBππSUB rightπPSET (a, b), 0   'See SUB DOWN it's the same thing...πDRAW "e10f10l20"πa = a + 1πPSET (a, b), 12πDRAW "e10f10l20"πPAINT (a + 3, b - 1), 14, 12ππEND SUBππSUB shootπLINE (a + 10, b - 13)-(a + 10, b - 50), 10  'Draw the green shooting line.πFOR cool = 1 TO 100: NEXT cool              'Delay...πLINE (a + 10, b - 13)-(a + 10, b - 50), 0   'Draw over top of the shootingπ                        'line in black.πEND SUBππSUB upπPSET (a, b), 0    'See SUB DOWN.  Same dif...πDRAW "e10f10l20"πb = b - 1πPSET (a, b), 12πDRAW "e10f10l20"πPAINT (a + 3, b - 1), 14, 12πEND SUBππSUB warpπPAINT (a + 3, b - 1), 0, 12 'This SUB drops the ship somewhere else.πPSET (a, b), 0              'Figure it out each line by line for yourself...πDRAW "e10f10l20"            'I'm sick of explaining every little thing...πa = INT(RND * 300)πb = INT(RND * 180)πPSET (a, b), 12πDRAW "e10f10l20"πPAINT (a + 3, b - 1), 14, 12πFOR cool = 1 TO 1000: NEXT coolπEND SUBπMarek Piotrowski               PARALLEL PORT TEST UTILITY     ao487@freenet.toronto.on.ca    10-29-96 (19:33)       QB, QBasic, PDS        335  11414    PRNPORT.BAS '╔════════════════════════════════════════════════════════════════════════════╗π'║                                                                            ║π'║                                                                            ║π'║ PRNPORT.BAS is a parallel port test utility. It allows single bit toggle   ║π'║          and single bit monitoring of a selected parallel port.            ║π'║                                                                            ║π'║         Author: Marek Piotrowski ao487@toronto.freenet.on.ca               ║π'║                                                                            ║π'║         Credits: Christoph Kummetat for FindPort subroutine.               ║π'║                                                                            ║π'╚════════════════════════════════════════════════════════════════════════════╝ππDIM SHARED Bit(2, 7) AS INTEGERπDIM SHARED OldByte(2) AS INTEGERπDIM SHARED Byte(2) AS INTEGERπDIM SHARED Port(4) AS INTEGERππDECLARE SUB ToggleBit (PortNum$)πDECLARE SUB DrawBottomBar ()πDECLARE SUB FindPort (PortNum$)πDECLARE SUB DrawScreen ()πDECLARE SUB PrintPortHeaders (PortNum$)πDECLARE SUB ReadPort (PortNum$)πDECLARE SUB BitPinToggle (Q$, BitPinSw%)πDECLARE SUB MoveCursor (Q$)ππππBitPinSw% = 1                          'Bit or Pin number display switchπ                                       '(1 = Bit numer display)πFOR Pt% = 0 TO 2πOldByte(Pt%) = NOT Byte(Pt%)πNEXT Pt%πππCLSππDATA " 9"," 8"," 7"," 6"," 5"," 4"," 3"," 2"πDATA "11","10","12","13","15","  ","  ","  "πDATA "  ","  ","  ","  ","17","16","14"," 1"ππFindPort PortNum$             'Find ports availableπDrawBottomBarπDrawScreen                    'Draw screen subroutineπBitPinToggle Q$, BitPinSw%    'Bit/Pin number display toggle subroutineπPrintPortHeaders PortNum$     'PrintPortHeaders subroutineππππDOπQ$ = INKEY$ππReadPort PortNum$   'read data from the ports subroutineπππππ    IF Q$ = CHR$(9) THENπ        BitPinToggle Q$, BitPinSw%   'Bit/Pin number display toggle subroutineπ    END IFππ    IF LEN(Q$) > 1 THENπ        MoveCursor Q$                'Cursor movement subroutineπ    END IFππ    IF Q$ = CHR$(32) THEN     'Detect space bar to toggle single bitπ                              'at cursor position.πToggleBit PortNum$        'Toggle one bitπππ    END IFπππLOOP WHILE Q$ <> CHR$(27)πCOLOR 7, 0πCLSππSUB BitPinToggle (Q$, BitPinSw%)ππ        OldCurRow% = CSRLINπ        OldCurCol% = POS(0)πππ            IF BitPinSw% > 0 THEN          'Toggle Pin to Bit numbersπ            COLOR 7, 0π            FOR Row% = 20 TO 21π                LOCATE Row%, 3: PRINT STRING$(77, 32)π            NEXT Row%πππ            COLOR 12, 1π            LOCATE 9, 4: PRINT "Bit"π                FOR i = 55 TO 48 STEP -1π                LOCATE 11 + (55 - i), 5π                PRINT " "; CHR$(i)π                NEXT iπ            LOCATE 9, 29: PRINT "Bit"π                FOR i = 55 TO 48 STEP -1π                LOCATE 11 + (55 - i), 30π                PRINT " "; CHR$(i)π                NEXT iπ            LOCATE 9, 53: PRINT "Bit"π                    FOR i = 55 TO 48 STEP -1π                    LOCATE 11 + (55 - i), 54π                    PRINT " "; CHR$(i)π                    NEXT iπ            ELSEππππ            COLOR 10, 1π            LOCATE 9, 4: PRINT "Pin"        'Toggle Bit to Pin numbersπ                FOR i = 55 TO 48 STEP -1π                READ A$π                LOCATE 11 + (55 - i), 5π                PRINT A$π                NEXT iπ            LOCATE 9, 29: PRINT "Pin"π                FOR i = 55 TO 48 STEP -1π                READ A$π                LOCATE 11 + (55 - i), 30π                PRINT A$π                NEXT iπ            LOCATE 9, 53: PRINT "Pin"π                    FOR i = 55 TO 48 STEP -1π                    READ A$π                    LOCATE 11 + (55 - i), 54π                    PRINT A$π                    NEXT iππ            COLOR 7, 0π            LOCATE 20, 3: PRINT "Pin numbers apply to D-type 25 pin connector."π            LOCATE 21, 3: PRINT "Pins 18 through 25 are logic ground."π            RESTOREπ            END IFππ    COLOR 7, 0π    LOCATE OldCurRow%, OldCurCol%, 1, 0, 4ππ    BitPinSw% = -BitPinSw%πππEND SUBππSUB DrawBottomBarππLOCATE 23, 1πCOLOR 7, 0: PRINT " ";πCOLOR 0, 11: PRINT "       Esc ";πCOLOR 15, 11: PRINT "- quit, ";πCOLOR 0, 11: PRINT "Tab ";πCOLOR 15, 11: PRINT "- Bit/Pin number toggle, ";πCOLOR 0, 11: PRINT "Space Bar ";πCOLOR 15, 11: PRINT "- toggle a bit      ";ππCOLOR 7, 0ππEND SUBππSUB DrawScreenπLOCATE 1, 1πPRINT STRING$(80, 32)πPRINT " "; : COLOR 14, 1: PRINT " ╔══════════════════════════════════════════════════════════════════════════╗ "; : COLOR 7, 0: PRINT " "πPRINT " "; : COLOR 14, 1: PRINT " ║          PARALLEL PORT DIAGNOSTIC UTILITY - by Marek Piotrowski          ║ "; : COLOR 7, 0: PRINT " "πPRINT " "; : COLOR 14, 1: PRINT " ╠══════════════════════════════════════════════════════════════════════════╣ "; : COLOR 7, 0: PRINT " "πPRINT " "; : COLOR 14, 1: PRINT " ║                               PORT ADDRESS                               ║ "; : COLOR 7, 0: PRINT " "πPRINT " "; : COLOR 14, 1: PRINT " ╟────────────────────────╥───────────────────────╥─────────────────────────╢ "; : COLOR 7, 0: PRINT " "πPRINT " "; : COLOR 14, 1: PRINT " ║      ..... OUTPUT      ║      ..... INPUT      ║      ..... OUTPUT       ║ "; : COLOR 7, 0: PRINT " "πPRINT " "; : COLOR 14, 1: PRINT " ╟───┬──────┬─────────────╫───┬──────┬────────────╫───┬──────┬──────────────╢ "; : COLOR 7, 0: PRINT " "πPRINT " "; : COLOR 14, 1: PRINT " ║   │Status│  Function   ║   │Status│  Function  ║   │Status│  Function    ║ "; : COLOR 7, 0: PRINT " "πPRINT " "; : COLOR 14, 1: PRINT " ╟───┼──────┼─────────────╫───┼──────┼────────────╫───┼──────┼──────────────╢ "; : COLOR 7, 0: PRINT " "πPRINT " "; : COLOR 14, 1: PRINT " ║   │ .... │ data        ║   │ .... │busy        ║   │ .... │reserved      ║ "; : COLOR 7, 0: PRINT " "πPRINT " "; : COLOR 14, 1: PRINT " ║   │ .... │ data        ║   │ .... │acknowledge ║   │ .... │reserved      ║ "; : COLOR 7, 0: PRINT " "πPRINT " "; : COLOR 14, 1: PRINT " ║   │ .... │ data        ║   │ .... │out of paper║   │ .... │reserved      ║ "; : COLOR 7, 0: PRINT " "πPRINT " "; : COLOR 14, 1: PRINT " ║   │ .... │ data        ║   │ .... │prn.selected║   │ .... │enable IRQ    ║ "; : COLOR 7, 0: PRINT " "πPRINT " "; : COLOR 14, 1: PRINT " ║   │ .... │ data        ║   │ .... │error       ║   │ .... │select prn.   ║ "; : COLOR 7, 0: PRINT " "πPRINT " "; : COLOR 14, 1: PRINT " ║   │ .... │ data        ║   │ .... │IRQ occured ║   │ .... │initialize prn║ "; : COLOR 7, 0: PRINT " "πPRINT " "; : COLOR 14, 1: PRINT " ║   │ .... │ data        ║   │ .... │reserved    ║   │ .... │auto line feed║ "; : COLOR 7, 0: PRINT " "πPRINT " "; : COLOR 14, 1: PRINT " ║   │ .... │ data        ║   │ .... │reserved    ║   │ .... │strobe        ║ "; : COLOR 7, 0: PRINT " "πPRINT " "; : COLOR 14, 1: PRINT " ╚═══╧══════╧═════════════╩═══╧══════╧════════════╩═══╧══════╧══════════════╝ "; : COLOR 7, 0: PRINT " "πLOCATE 22, 3: PRINT "Output pins 1, 14, 17 and input pin 11 operate in negative logic."πLOCATE 11, 8, 1, 0, 4ππEND SUBππSUB FindPort (PortNum$)ππ   DEF SEG = 0π   Count = 0π   FOR i = 1032 TO 1036 STEP 2π      PortAdd% = PEEK(i) + 256 * PEEK(i + 1)π      IF PortAdd% > 0 THENπ         Count = Count + 1π         Port(Count) = VAL("&H" + HEX$(PortAdd%))π         PRINT "Parallel port"; STR$(Count); " at ";π         PRINT "&H" + HEX$(PortAdd%)π      END IFπ   NEXT iππ    IF Count = 0 THEN                                          'no port foundπ        PRINT "No parallel port found on your PC !";π    ELSEπ        PRINT "Which parallel port do you want to use : ";π            DOπ            PortNum$ = INKEY$π            LOOP WHILE VAL(PortNum$) < 1 OR VAL(PortNum$) > Countππ    END IFππEND SUBππSUB MoveCursor (Q$)ππ         Q$ = RIGHT$(Q$, 1)π         SELECT CASE ASC(Q$)π            CASE 75 TO 77              'When left or right arrow key pressedπ                IF POS(0) < 34 THEN    'toggle cursor column between 8 and 57.π                LOCATE , 57, 1, 0, 4π                ELSEπ                LOCATE , 8, 1, 0, 4π                END IFπ            CASE IS = 72                     'When up arrow key pressedπ                IF CSRLIN > 11 THEN          'move cursor up or wrap fromπ                LOCATE CSRLIN - 1, , 1, 0, 4 'row 11 to 18.π                ELSEπ                LOCATE 18, , 1, 0, 4π                END IFπ            CASE IS = 80                     'When down arrow key pressedπ                IF CSRLIN > 17 THEN          'move cursor down or wrap fromπ                LOCATE 11, , 1, 0, 4         'row 18 to 11.π                ELSEπ                LOCATE CSRLIN + 1, , 1, 0, 4π                END IFπππ         END SELECTππEND SUBππSUB PrintPortHeaders (PortNum$)ππ        OldCurRow% = CSRLINπ        OldCurCol% = POS(0)π        COLOR 14, 1π        LOCATE 7, 10π        PRINT "&H"; HEX$(Port(VAL(PortNum$)));π        LOCATE 7, 35π        PRINT "&H"; HEX$(Port(VAL(PortNum$)) + 1)π        LOCATE 7, 59π        PRINT "&H"; HEX$(Port(VAL(PortNum$)) + 2)π        LOCATE OldCurRow%, OldCurCol%ππEND SUBππSUB ReadPort (PortNum$)πππ    FOR Pt% = 0 TO 2                            'Read data from the portππ                OldCurRow% = CSRLIN             'Save old cursorπ                OldCurCol% = POS(0)             'position before screen updateπππ        Byte(Pt%) = INP(Port(VAL(PortNum$)) + Pt%)ππ        IF Byte(Pt%) <> OldByte(Pt%) THEN       'If new byte differs fromπ                                                'old one write new bitsππ            FOR Bt% = 0 TO 7π            Bit(Pt%, Bt%) = (2 ^ Bt% AND Byte(Pt%)) \ (2 ^ Bt%)π            NEXT Bt%ππππ            SELECT CASE Pt%π                CASE IS = 0π                    Clmn% = 9π                CASE IS = 1π                    Clmn% = 34π                CASE IS = 2π                    Clmn% = 58π            END SELECTππ            FOR Bt% = 7 TO 0 STEP -1π                IF Bit(Pt%, Bt%) > 0 THENπ                    COLOR 15, 4π                    Tag$ = "High"π                    ELSEπ                    COLOR 0, 2π                    Tag$ = "Low "π                END IFπππ                LOCATE 18 - Bt%, Clmn%π                PRINT Tag$π            NEXT Bt%ππ            COLOR 7, 0π            LOCATE OldCurRow%, OldCurCol%, 1, 0, 4     'Restore cursor positionπππ        END IFππ        OldByte(Pt%) = Byte(Pt%)ππ    NEXT Pt%πππEND SUBππSUB ToggleBit (PortNum$)πππ        SELECT CASE POS(0)    'Determine which output you will write to.π            CASE IS = 8π                Pt% = 0π            CASE IS = 57π                Pt% = 2π        END SELECTππ        IF Bit(Pt%, 18 - CSRLIN) > 0 THEN        'Toggle sigle bit.π            Bit(Pt%, 18 - CSRLIN) = 0π            ELSEπ            Bit(Pt%, 18 - CSRLIN) = 1π        END IFπππ        Byte(Pt%) = 0π        FOR i = 0 TO 7π            Byte(Pt%) = Byte(Pt%) + (Bit(Pt%, i) * 2 ^ i)π        NEXT iππ        OUT (Port(VAL(PortNum$)) + Pt%), Byte(Pt%)ππEND SUBπKurt Kuzba                     TERMINAL W/ANSI EMULATION      FidoNet QUIK_BAS Echo          06-05-96 (00:00)       QB, QBasic, PDS        201  7783     QUIKTERM.BAS'_|_|_|   QUIKTERM.BASπ'_|_|_|   This program will operate in ANSI emulation with ANSIπ'_|_|_|   auto-detect. Must be compiled for high speeds.π'_|_|_|   No warrantee or guarantee is given or implied.π'_|_|_|   Released to   PUBLIC DOMAIN   by Kurt Kuzba.  (6/5/96)πDECLARE SUB QuikCFG (d() AS STRING)πDECLARE SUB ansi (A$)πON ERROR GOTO BooBooπDIM FKEYS(13) AS STRING: port% = 0πFError$ = "ok": OPEN "quikterm.cfg" FOR INPUT AS #2πIF FError$ = "ok" THENπ   FOR t% = 0 TO 13π      IF EOF(2) THEN EXIT FORπ      LINE INPUT #2, FKEYS(t%)π   NEXT: port% = VAL(FKEYS(0))πEND IF: CLOSE 2πEx$ = CHR$(27) + "[": CrLf$ = CHR$(13) + CHR$(10)πCLS : altx$ = Ex$ + "0;1;32mALT/X to exit terminal" + CrLf$πIF port% = 0 THENπ   LOCATE 1, 1, 1: PRINT "Choose a port (1/2)"π   DO: port% = INSTR(" 12", INKEY$): LOOP WHILE port% < 2π   port% = port% - 1: FError$ = "ok"π   OPEN "quikterm.cfg" FOR OUTPUT AS #2π   IF FError$ = "ok" THEN PRINT #2, MID$(STR$(port%), 2)πEND IF: CLOSE 2πFOR t% = 1 TO 34: ansi MID$(altx$, t%, 1): NEXTπport$ = "COM" + MID$(STR$(port%), 2) + ":19200,N,8,1"πFError$ = "ok": OPEN port$ FOR RANDOM AS #1 LEN = 8192πIF FError$ <> "ok" THEN PRINT "MODEM ERROR": ENDπDOπ   Modemin$ = "": IF NOT EOF(1) THEN Modemin$ = INPUT$(1, #1)π   ansi Modemin$π   IF ANSIDetect$ <> "" THEN PRINT #1, ANSIDetect$: ANSIDetect$ = ""π   kb$ = INKEY$π   IF kb$ <> "" THENπ      k% = ASC(kb$)π      IF k% = 0 THENπ         k% = ASC(MID$(kb$, 2))π         SELECT CASE k%π            CASE 45: CLOSE #1: ENDπ            CASE 59 TO 68: k% = k% - 58π               kb$ = FKEYS(k%)π               DO: e% = INSTR(UCASE$(kb$), "^M")π                  IF e% > 0 THEN MID$(kb$, e%) = MID$(kb$, e% + 1)π                  IF e% > 0 THEN kb$ = LEFT$(kb$, LEN(kb$) - 1)π                  IF e% > 0 THEN MID$(kb$, e%, 1) = CHR$(13)π               LOOP WHILE e% > 0π               IF FKEYS(k%) = "" THEN k% = 0π            CASE 133, 134: k% = k% = 122π               kb$ = FKEYS(k%)π               IF FKEYS(k%) = "" THEN k% = 0π            CASE 37: QuikCFG FKEYS(): k% = 0π            CASE ELSE: k% = 0π         END SELECTπ      END IF: IF k% > 0 THEN PRINT #1, kb$;π   END IFπLOOP: CLOSE #1: ENDπBooBoo:π   FError$ = STR$(ERR): RESUME NEXTπDEFINT A-ZπSUB ansi (A$)πDEFINT A-Z: DEF SEG = &HB800πSTATIC W, e, L, C, O, M, F, B, V, e$: SHARED ANSIDetect$πIF W < 99 THEN W = 100: C = 0: F = 7: B = 0: A = 0: M = F + 16 * BπIF A$ = "" THEN LOCATE C \ 80 + 1, C MOD 80 + 1, 1: EXIT SUBπIF e <> 27 THENπ   IF ASC(A$) <> 27 THEN GOSUB CHRout:  ELSE e = 27: e$ = A$π   EXIT SUBπEND IFπIF O <> 27 AND ASC(A$) = 34 THEN O = e: EXIT SUBπIF O = 27 THENπ   IF ASC(A$) = 34 THEN O = 0π   EXIT SUBπEND IF: e$ = e$ + A$πIF LEN(e$) = 2 AND A$ <> "[" THEN e = 0: e$ = "": EXIT SUBπS = INSTR("HfABCDsuJKmhlpn", A$)πSELECT CASE Sπ  CASE 0: EXIT SUBπ  CASE 1: GOSUB CursorAπ  CASE 2: GOSUB CursorAπ  CASE 3: L = -1: GOSUB CursorLπ  CASE 4: L = 1: GOSUB CursorLπ  CASE 5: L = 1: GOSUB CursorCπ  CASE 6: L = -1: GOSUB CursorCπ  CASE 7: V = Cπ  CASE 8: C = Vπ  CASE 9: COLOR F, B: CLS : C = 0π  CASE 10: FOR L = C TO C + 79 - (C MOD 80)π           POKE L * 2, 32: POKE L * 2 + 1, M: NEXTπ  CASE 11: GOSUB Colorzπ  CASE 15: A$ = CHR$(27) + "[" + MID$(STR$(C \ 80 + 1), 2) + ";"π           ANSIDetect$ = A$ + MID$(STR$((C MOD 80) + 1), 2) + "R"πEND SELECT: e = 0: e$ = "": EXIT SUBπCursorA: L = VAL(MID$(e$, INSTR(e$, "[") + 1))π   C = VAL(MID$(e$, INSTR(e$, ";") + 1))π   IF C > 0 THEN C = (C - 1): IF C > 79 THEN C = 79π   IF L > 0 THEN L = (L - 1): IF L > 24 THEN L = 24π   C = L * 80 + C: RETURNπCursorL: p = VAL(MID$(e$, INSTR(e$, "[") + 1))π   p = p - (p < 1): L = INT(C \ 80) + p * Lπ   IF L < 0 THEN L = 0:  ELSE IF L > 24 THEN L = 24π   C = (C MOD 80) + L * 80: RETURNπCursorC: p = VAL(MID$(e$, INSTR(e$, "[") + 1))π   p = p - (p < 1): L = (C MOD 80) + p * L: C = INT(C \ 80) * 80π   IF L < 1 THEN L = 0:  ELSE IF L > 79 THEN L = 79π   C = C + L: RETURNπColorz: e$ = MID$(e$, INSTR(e$, "[") + 1)π   DO: e = VAL(e$)π      SELECT CASE eπ         CASE 0: F = 15: B = 0π         CASE 1: F = F OR 8π         CASE 5: B = B OR 8π         CASE 8: F = Bπ         CASE 30 TO 37: p = e - 29π            e = ASC(MID$("@DBFAECG", p)) AND 7: F = (F AND 248) + eπ         CASE 40 TO 47: p = e - 39π            e = ASC(MID$("@DBFAECG", p)) AND 7: B = (B AND 248) + eπ      END SELECT: p = INSTR(e$, ";"): e$ = MID$(e$, p + 1)π   LOOP WHILE p > 0: M = F + 16 * B: RETURNπCHRout: p = ASC(A$)π   IF p = 7 THEN FOR t% = 800 TO 1111 STEP 20: SOUND t%, .1: NEXT: RETURNπ   IF p = 8 THENπ      IF (C MOD 80) > 0 THENπ         FOR t% = C * 2 TO (C \ 80) * 160 + 159π            POKE t% - 2, PEEK(t%)π         NEXT: C = C - 1π      END IF: RETURNπ   END IFπ   IF p = 13 THEN C = C - (C MOD 80): RETURNπ   IF p = 10 THEN C = C + 80π   IF p <> 10 THEN POKE C * 2, p: POKE C * 2 + 1, M: C = C + 1π   IF C >= 2000 THENπ      C = C - 80: LOCATE 30, 80: PRINTπ      DIM PK%(2): PK%(0) = 32: PK%(1) = Mπ      FOR L = 3680 TO 3839π         POKE L, PEEK(L + 160): POKE L + 160, PK%(L AND 1)π      NEXTπ   END IF: RETURNπEND SUBππSUB QuikCFG (d() AS STRING)π   SHARED port%π   DIM buf(4000) AS STRING * 1: DEF SEG = &HB800: F$ = SPACE$(80)π   FOR t% = 0 TO 3999: buf(t%) = CHR$(PEEK(t%)): NEXTπ   csr% = LEN(d(0)) + 1: macro% = 0: COLOR 10, 0: CLS : COLOR 14, 4π   PRINT " COM "; : COLOR 10, 0: PRINT LEFT$(d(0) + F$, 75);π   FOR t% = 1 TO 12π      COLOR 14, 4: LOCATE t% + 1, 1: PRINT " F"; RIGHT$(STR$(t%), 2); " ";π      COLOR 10, 0: PRINT LEFT$(d(t%) + F$, 75); : NEXTπ   PRINT : PRINT : PRINT "RETURN exits: ALT/S saves"π   DO: LOCATE macro% + 1, 6: COLOR 15, 1: PRINT LEFT$(d(macro%) + F$, 75);π      LOCATE , csr% + 5: DO: k$ = INKEY$: LOOP WHILE k$ = ""π      k% = ASC(k$): IF k% = 0 THEN k% = -ASC(MID$(k$, 2))π      SELECT CASE k%π         CASE 8π            IF csr% > 1 THENπ               csr% = csr% - 1π               MID$(d(macro%), csr%) = MID$(d(macro%), csr% + 1)π               d(macro%) = LEFT$(d(macro%), LEN(d(macro%)) - 1)π            ELSE SOUND 999, .7π            END IFπ         CASE 13: FOR t% = 0 TO 3999: POKE t%, ASC(buf(t%)): NEXT: EXIT SUBπ         CASE 32 TO 255π            L$ = LEFT$(d(macro%), csr% - 1): r$ = MID$(d(macro%), csr%)π            d(macro%) = LEFT$(L$ + k$ + r$, 70)π            IF csr% < 75 THEN csr% = csr% + 1:  ELSE SOUND 999, .7π         CASE -31π            FError$ = "ok": OPEN "quikterm.cfg" FOR OUTPUT AS #2π            IF FError$ = "ok" THENπ               FOR t% = 0 TO 13: PRINT #2, d(t%): NEXT: port% = VAL(d(0))π            END IF: CLOSE 2π         CASE -71: csr% = 1π         CASE -72π            IF macro% > 0 THENπ               LOCATE macro% + 1, 6: COLOR 10, 0π               PRINT LEFT$(d(macro%) + F$, 75);π               macro% = macro% - 1: csr% = LEN(d(macro%)) + 1π            ELSE SOUND 999, .7π            END IFπ         CASE -75π            IF csr% > 1 THEN csr% = csr% - 1:  ELSE SOUND 999, .7π         CASE -77π            IF csr% < 70 THEN csr% = csr% + 1:  ELSE SOUND 999, .7π         CASE -79: csr% = LEN(d(macro%)) + 1π         CASE -80π            IF macro% < 12 THENπ               LOCATE macro% + 1, 6: COLOR 10, 0π               PRINT LEFT$(d(macro%) + F$, 75);π               macro% = macro% + 1: csr% = LEN(d(macro%)) + 1π            ELSE SOUND 999, .7π            END IFπ         CASE -83π            IF LEN(d(macro%)) >= csr% THENπ               MID$(d(macro%), csr%) = MID$(d(macro%), csr% + 1)π               d(macro%) = LEFT$(d(macro%), LEN(d(macro%)) - 1)π            ELSE SOUND 999, .7π            END IFπ      END SELECTπ   LOOPπEND SUBπ'_|_|_|   end   QUIKTERM.BASπBrian Mahocker                 PHREAK FONE                    ButtNuggie@aol.com             10-22-96 (18:45)       QB, QBasic, PDS        48   3463     PFONE10.BAS 'Phreak Fone Ver. 1.0   By: Brian MahockerπStart:πCLSπLET Start% = 0πLOCATE 1, 1: COLOR 8: PRINT "P"; : COLOR 7: PRINT "H"; : COLOR 15: PRINT "R"; : COLOR 8: PRINT "e"; : COLOR 7: PRINT "a"; : COLOR 15: PRINT "K"; : COLOR 8: PRINT " "; : COLOR 7: PRINT "F"; : COLOR 15: PRINT "o"; : COLOR 8: PRINT "N"; : COLOR 7: PRINT "e"; : COLOR 15: PRINT " "; : COLOR 8: PRINT " "; : COLOR 7: PRINT "V"; : COLOR 15: PRINT "e"; : COLOR 8: PRINT "R"; : COLOR 7: PRINT "."; : COLOR 15: PRINT " "; : COLOR 8: PRINT "1"; : COLOR 7: PRINT "."; : COLOR 15: PRINT "0"; : COLOR 8: PRINT "           "; : COLOR 7: PRINT "B"; : COLOR 15: PRINT "y"; : COLOR 8: PRINT ":"; : COLOR 7: PRINT " "; : COLOR 15: PRINT "B"; : COLOR 8: PRINT "R"; : COLOR 7: PRINT "i"; : COLOR 15: PRINT "a"; : COLOR 8: PRINT "n"; : COLOR 7: PRINT " "; : COLOR 15: COLOR 8: PRINT "M"; : COLOR 7: PRINT "a"; : COLOR 15: PRINT "H"; : COLOR 8: PRINT "o"; : COLOR 7: PRINT "C"; : COLOR 15: PRINT "K"; : COLOR 8: PRINT "e"; : COLOR 7: PRINT "R": COLOR 15: PRINTπINPUT "THe LoWeST NuMBeR To DiaL  (No Dash) : ", LN&πINPUT "THe HiGHeST NuMBeR To DiaL (No Dash) : ", HN&πINPUT "PoRT NuMBeR (1/2) : ", port$πINPUT "RePeaT? (Y/N) :", R$: IF R$ = "Y" OR R$ = "y" THEN LET Repeat% = 1: IF R$ = "N" OR R$ = "n" THEN LET Repeat% = 0:πINPUT "aRe THeSe SeTTiNGS CoRReCT? (Y/N) : ", correct$: IF correct$ = "N" OR correct$ = "n" THEN GOTO StartπCLSπLOCATE 1, 1: COLOR 8: PRINT "P"; : COLOR 7: PRINT "H"; : COLOR 15: PRINT "R"; : COLOR 8: PRINT "e"; : COLOR 7: PRINT "a"; : COLOR 15: PRINT "K"; : COLOR 8: PRINT " "; : COLOR 7: PRINT "F"; : COLOR 15: PRINT "o"; : COLOR 8: PRINT "N"; : COLOR 7: PRINT "e"; : COLOR 15: PRINT " "; : COLOR 8: PRINT " "; : COLOR 7: PRINT "V"; : COLOR 15: PRINT "e"; : COLOR 8: PRINT "R"; : COLOR 7: PRINT "."; : COLOR 15: PRINT " "; : COLOR 8: PRINT "1"; : COLOR 7: PRINT "."; : COLOR 15: PRINT "0"; : COLOR 8: PRINT "           "; : COLOR 7: PRINT "B"; : COLOR 15: PRINT "y"; : COLOR 8: PRINT ":"; : COLOR 7: PRINT " "; : COLOR 15: PRINT "B"; : COLOR 8: PRINT "R"; : COLOR 7: PRINT "i"; : COLOR 15: PRINT "a"; : COLOR 8: PRINT "n"; : COLOR 7: PRINT " "; : COLOR 15: COLOR 8: PRINT "M"; : COLOR 7: PRINT "a"; : COLOR 15: PRINT "H"; : COLOR 8: PRINT "o"; : COLOR 7: PRINT "C"; : COLOR 15: PRINT "K"; : COLOR 8: PRINT "e"; : COLOR 7: PRINT "R": COLOR 15: PRINTπLOCATE 3, 1: PRINT "CuRReNT FoNe NuMBeR :"πLOCATE 4, 1: PRINT "TiMe LeFT FoR CuRReNT FoNe NuMBeR :"πLOCATE 5, 1: PRINT "CuRReNT PoRT : "πCOLOR 8: LOCATE 5, 16: PRINT port$πStartDialing:πLET PN& = LN&πDOπCOLOR 8: LOCATE 3, 22: PRINT PN&: COLOR 15πOPEN "COM" + port$ + ":" + "9600,N,8,1,ASC" FOR OUTPUT AS #1πPRINT #1, "ATD" + ""; PN&; ""πLET time% = 15πDOπSOUND 32767, 9.1πSOUND 32767, 9.1πCOLOR 8: LOCATE 4, 36: PRINT time%πLET time% = time% - 1πLOOP UNTIL time% = -1πSOUND 32767, 10πPRINT #1, "+++"πSOUND 32767, 10πPRINT #1, "AT Z H0"πPRINT #1, "ATH"πSOUND 32767, 10πCLOSE #1πIF Repeat% = 1 AND PN& = HN& THEN GOTO StartDialingπIF Rapeat% = 0 AND PN& = HN& THEN GOTO End.πLET PN& = PN& + 1πLOOPπEnd.:πPLAY "T200L50MLO4C#DD#EFF#GG#AA#B>CC#DD#EFP8.<C#DD#EFF#GG#AA#B>"πPLAY "T200L50MLO4C#DD#EFF#GG#AA#B>CC#DD#EFP8.<C#DD#EFF#GG#AA#B>"πPLAY "T200L50MLO4C#DD#EFF#GG#AA#B>CC#DD#EFP8.<C#DD#EFF#GG#AA#B>"πPLAY "T200L50MLO4C#DD#EFF#GG#AA#B>CC#DD#EFP8.<C#DD#EFF#GG#AA#B>"πPLAY "T200L50MLO4C#DD#EFF#GG#AA#B>CC#DD#EFP8.<C#DD#EFF#GG#AA#B>"πPLAY "T200L50MLO4C#DD#EFF#GG#AA#B>CC#DD#EFP8.<C#DD#EFF#GG#AA#B>"ππScott Turchin                  BACKSPACE LOCALLY & OVER MODEM nitehawk@tscnet.com            10-29-96 (11:13)       PB                     127  3288     BACKSPC.BAS SUB XPRINT(Fore%,Back%,StringofData$,LF%) PUBLICπ'------------No color--------------------πIF NOT Ansi% THEN  'Don't add colors in..π    COLOR Fore%,Back%π    PRINT StringofData$;π    PRINT #1, StringofData$;π        IF LF%=1 THENπ        PRINTπ        IF Carrier(Port%) THEN PRINT #1,CRLF$π    END IFπ        EXIT SUBπEND IFππ'-------------color part--------------------πESC1$=LTRIM$(CHR$(27)+"[")    'esc$ was used publicly in my program, I choseπesc1$ to eliminate problems.πGOSUB SETCOLORSππIF Carrier(Port%) THEN Print #1, ForeColor$+StringofData$;πIF Carrier(Port%) AND (Flash% OR Back%>0) THEN PRINT #1,CHR$(27)+"[0;30m";π'clears flashingππIF Flash% THEN INCR Fore%,16πCOLOR Fore%,Back%πIF INSTR(StringofData$,CHR$(8)) THEN EXIT SUB ELSE PRINT StringofData$; 'Doπnot print the backspace...ππIF LF%=1 THENπ    COLOR 7,0π    PRINTπ    IF Carrier(Port%) THEN PRINT #1,CRLF$πEND IFπCOLOR 7,0 'Reset it..just in caseπEXIT SUBππSETCOLORS:πIF Fore% <= 8 THEN ESC1$=ESC1$+"0;"πIF Fore%>8 AND Fore%<16 THEN ESC1$=ESC1$+"1;"πIF Fore%>16 THENπ        Flash%=-1π        ESC1$=ESC1$+"5;"π    DECR Fore%,16πEND IFπ   SELECT CASE Fore%π        CASE 0π        ForeColor$=ESC1$+"30m"π        CASE 1π         ForeColor$=ESC1$+"34m"π        CASE 2π         ForeColor$=ESC1$+"32m"π        CASE 3π         ForeColor$=ESC1$+"36m"π        CASE 4π         ForeColor$=ESC1$+"31m"π        CASE 5π         ForeColor$=ESC1$+"35m"π        CASE 6π         ForeColor$=ESC1$+"33m"π        CASE 7π         ForeColor$=ESC1$+"37m"π        CASE 8π         ForeColor$=ESC1$+"30m"π        CASE 9π         ForeColor$=ESC1$+"34m"π        CASE 10π           ForeColor$=ESC1$+"32m"π        CASE 11π           ForeColor$=ESC1$+"36m"π        CASE 12π           ForeColor$=ESC1$+"31m"π        CASE 13π           ForeColor$=ESC1$+"35m"π        CASE 14π           ForeColor$=ESC1$+"33m"π        CASE 15π           ForeColor$=ESC1$+"37m"π        CASE ELSEπ           Fore%=7π   END SELECTπIF Back%>0 THEN ForeColor$=LEFT$(ForeColor$,6)π   SELECT CASE Back%π        CASE 0π        'IS ASSUMED BLACK ALREADYπ        CASE 1π           ForeColor$=ForeColor$+";44m"π        CASE 2π           ForeColor$=ForeColor$+";42m"π        CASE 3π           ForeColor$=ForeColor$+";46m"π        CASE 4π           ForeColor$=ForeColor$+";41m"π        CASE 5π           ForeColor$=ForeColor$+";45m"π        CASE 6π           ForeColor$=ForeColor$+";43m"π        CASE 7π           ForeColor$=ForeColor$+";47m"π        CASE ELSEπ           Back%=0π   END SELECTπRETURNπEND SUBππSUB BACKSPACE(I$,Fore%,Back%) PUBLICπCOLOR Fore%,Back%πCHATX% = CSRLIN: CHATY% = POS( O )πIF CHATY%=1 THENπ    PRINT " ";π        LOCATE CHATX%,CHATY%,1πELSEπLOCATE CHATX%,CHATY%-1πPRINT " ";πLOCATE CHATX%,CHATY%-1πEND IFπXPRINT Fore%,Back%,CHR$(8)+" "+CHR$(27)+"[D",0 'backspace one line, move πforward one line remotely using ANSI escape sequence.πIF InChat% THEN    'This backspaces a chat.log file in my chat routine..π    Y=LOF(3)    'chat.log is opened as #3...π    IF Y>2 THENπ        SEEK #3, Y-1π        PRINT #3," ";π        SEEK #3, Y-1π    END IFπEND IFπIF LEN(I$) THEN I$=LEFT$(I$,LEN(I$)-1) ELSE I$=NULL$  'subtract one πcharacter if it is a word otherwise eliminate it...πEND SUBπEgbert Zijlema                 MOUSE ROUTINES W/DOUBLE CLICK  zylema@bnc.nl                  09-03-96 (23:10)       PB                     400  11082    MOUS.BAS    ' MOUS.BAS        - mouse routines, new version with double clickπ'                   (revision of MOUSDEMO.BAS)π' Author          : Egbert Zijlema (E.Zijlema@uni4nn.iaf.nl)π' (up)Date        : September 3, 1996π' Language        : Power Basic 3.2π' Copyright status: Public Domainππ' Again?π' Yes, again a mouse routine from this author for a couple of reasons.π' A few minor bug fixes, to begin with.ππ' The most important reason for this revision, however, is a newπ' key/mouse trap: ScrollMouse. It now contains 2 different mouseπ' performances: the classical one to support pull down menus andπ' another one to doubleclick an item.ππ' In this revision I left a lot of things out, just to keep it asπ' simple as possible. For instance: the menu does not supportπ' highlighted characters and contains only 2 working options.π' Furthermore: I left the Power Basic mouse library out and replacedπ' it by plain BASIC INTERRUPT calls; only their names are identical.π' Registered PB-users may re-replace them by the faster assemblyπ' code that came with version 3.2 (subdirectory EXAMPLE\MOUSUNIT.BAS).π' In that case: DO NOT FORGET to implement the mouseflag tests in thoseπ' procedures. They are not in the original set. I suggested Dave Navarroπ' already to include them, in one way or another, within the followingπ' PB-release.ππ' ScrollMouse - method 1:π' When clicking in the menu bar the selected menu pops down. The normalπ' way here is to hold the left button until you confirm your selection byπ' releasing it.ππ' ScrollMouse - method 2:π' After you've selected "Select files" in the File menu you canπ' select 1 of the filenames by doubleclicking it. The doubleclick mustπ' be performed within half a second, otherwise the result will beπ' zero, in order to wait for a following doubleclick.π' You can always escape by pressing the Esc-key or the right mouse button.ππDEFINT A - Zππ%NO      =        0 : %YES    = NOT %NO              ' true or falseπ%ALTF    = 33 * 256 : %ALTX   = 45 * 256π%HOME    = 71 * 256 : %UP     = 72 * 256π%DOWN    = 80 * 256 : %ENDKEY = 79 * 256π%ENTER   = 13       : %ESCAPE = 27π%MOUSEDRIVER = &H33 : %AX = 1 : %BX = 2 : %CX = 3 : %DX = 4ππTYPE MOUSEFLAGSπ  mseon AS INTEGER                             ' cursor onπ  mouse AS INTEGER                             ' mouse is thereπ  menu AS BYTE                                 ' matrix rowcounterπEND TYPEπDIM mflg AS SHARED MOUSEFLAGSππDIM MainScreen AS SHARED STRING                ' original screenπDIM FileName(1 : 60) AS SHARED STRING          ' array of 60 elementsπDIM matrix(1 : 50, 1 : 80) AS SHARED INTEGER   ' 2 * 25 rows - 80 colsππ' NOTE: a text screen has 25 rows, indeed!π' BUT : the matrices of the menu(s) and the mainscreenπ'       overlap. Therefore we reserve 'rows' 26 through 50π'       for the menu, which is a much better way thanπ'       swapping them after every menu/main screen switch.ππSUB MousInitπ  temp = MsThere(buts)π  COLOR 15, 0π  LOCATE 25, 2π  IF temp THENπ    PRINT "Your mouse has ";LTRIM$(RTRIM$(STR$(buts))); " buttons";π    mflg.mouse = %YESπ  ELSEπ    PRINT "Mouse driver not available";π  END IFπEND SUBππFUNCTION MsThere(buts AS INTEGER) AS INTEGERπ  REG %AX, 0π  CALL INTERRUPT %MOUSEDRIVERπ  buts = REG(%BX)π  FUNCTION = REG(%AX)πEND FUNCTIONππSUB MsCursorOnπ  IF mflg.mouse = 0 THEN EXIT SUB            ' no mouse, so quitπ  IF mflg.mseon = 0 THEN                     ' only when mouse is offπ    REG %AX, 1π    CALL INTERRUPT %MOUSEDRIVERπ    mflg.mseon = %YES                        ' mouse cursor onπ  END IFπEND SUBππSUB MsCursorOffπ  IF mflg.mouse = 0 THEN EXIT SUBπ  IF mflg.mseon THENπ    REG %AX, 2π    CALL INTERRUPT %MOUSEDRIVERπ    mflg.mseon = 0                           ' mouse cursor offπ  END IFπEND SUBππSUB MsLocate(BYVAL row AS INTEGER, BYVAL col AS INTEGER)π  IF mflg.mouse = 0 THEN EXIT SUBπ  IF (pbvScrnMode = 7) OR (pbvScrnMode = 0) THENπ    row = (row - 1) * 8π    col = (col - 1) * 8π  END IFπ  REG %AX, 4π  REG %CX, colπ  REG %DX, rowπ  CALL INTERRUPT %MOUSEDRIVERπEND SUBππSUB MsStatus(buttons AS INTEGER, row AS INTEGER, col AS INTEGER)π  IF mflg.mouse = 0 THEN EXIT SUBπ  REG %AX, 3π  CALL INTERRUPT %MOUSEDRIVERπ  buttons = REG(%BX)π  row = REG(%DX)π  col = REG(%CX)π  IF (pbvScrnMode = 7) OR (pbvScrnMode = 0) THENπ    row = (row \ 8) + 1π    col = (col \ 8) + 1π  END IFπEND SUBππSUB MsSetWindow(BYVAL row  AS INTEGER, BYVAL col  AS INTEGER, _π                BYVAL rows AS INTEGER, BYVAL cols AS INTEGER)ππ  IF mflg.mouse = 0 THEN EXIT SUBπ  rows = row + rows - 1      ' adjust rows to real coordinatesπ  cols = col + cols - 1      ' adjust cols to real coordinatesππ  IF (pbvScrnMode = 7) OR (pbvScrnMode = 0) THENπ    row  = row * 8 - 1 : rows = rows * 8 - 1   ' adjust for PBπ    col  = col * 8 - 1 : cols = cols * 8 - 1   ' adjust for PBπ  END IFπ  REG %AX, 7π  REG %CX, colπ  REG %DX, colsπ  CALL INTERRUPT %MOUSEDRIVERπ  REG %AX, 8π  REG %CX, rowπ  REG %DX, rowsπ  CALL INTERRUPT %MOUSEDRIVERπEND SUBππSUB box(row, col, rows, cols, fore, back)π  ' draw single rectangleπ  toprow$ = CHR$(218) + STRING$(cols - 2, 196) + CHR$(191)  ' ┌──┐π  botrow$ = CHR$(192) + STRING$(cols - 2, 196) + CHR$(217)  ' └──┘π  vert$ = CHR$(179)                                         ' │ππ  COLOR fore, backπ  LOCATE row, col: PRINT toprow$;π  FOR count = row + 1 TO row + rows - 2π    LOCATE count, colπ    PRINT vert$; SPACE$(cols - 2); vert$;π  NEXTπ  LOCATE count, col: PRINT botrow$πEND SUBππSUB MenuMatricesπ  ' reserve rows 3 throug 12 (28-37 in the matrix) for pop down menusπ  ' this is enough if your menus contain no more than 10 optionsπ  mflg.menu = 25π  FOR row = 3 TO 12π    FOR cell = 1 TO 80π      matrix(row + mflg.menu, cell) = row - 2  + 256     ' no ascii!π    NEXTπ  NEXTπ  mflg.menu = 0πEND SUBππSUB DrawMenuBarπ  mflg.menu = 25π  COLOR 0, 7π  LOCATE 1, 1 : PRINT SPACE$(80);π  LOCATE 1, 5 : PRINT "ile"π  COLOR 15, 7π  LOCATE 1, 4 : PRINT "F"π  FOR cell = 4 TO 7π    matrix(1, cell) = %ALTFπ    matrix(1 + mflg.menu, cell) = %ALTFπ  NEXTπ  mflg.menu = 0πEND SUBππSUB FileMenu(choice)π  STATIC lastπ  REDIM MenuItem (1: 4) AS LOCAL STRINGπ  mflg.menu = 25π  exclude = %ALTFπ  options = 4π  column = 3π  MenuItem(1) = " Select files  "π  MenuItem(2) = " Not supported "π  MenuItem(3) = " Bla bla       "π  MenuItem(4) = " Exit          "π  MsCursorOffπ  box 2, column - 1, options + 2, LEN(MenuItem(1)) + 2, 15, 7π  FOR row = 3 TO 6π    LOCATE row, 3 : PRINT MenuItem(row - 2)π  NEXTπ  ScrollMenu last, MenuItem(), column, options, exclude, resultπ  last = resultπ  SELECT CASE resultπ    CASE 1π      mflg.menu = 0π      SelectFilesπ    CASE 4 : choice = %ALTXπ  END SELECTπEND SUBππFUNCTION ScrollMouse AS INTEGERπ  MsStatus oldButn, oldRow, oldColπ  IF oldButn = 1 THEN                            ' test status to avoidπ                                                 ' repeat (causes flicker)π    oldKey = matrix(oldRow + mflg.menu, oldCol)π  END IFπ  DOπ    MsStatus buttons, row, colπ    IF INSTAT THENπ      FUNCTION = CVI( INKEY$ + CHR$(0) )π      EXIT FUNCTIONπ    ELSEIF buttons = 1 AND matrix(row + mflg.menu, col) <> oldKey THENπ      FUNCTION = matrix(row + mflg.menu, col)π      EXIT FUNCTIONπ    ELSEIF buttons = 2 THEN                      ' right button = escapeπ      ReleaseButtonsπ      FUNCTION = %ESCAPEπ      EXIT FUNCTIONπ    END IFπ  LOOP UNTIL (oldButn = 1) AND (buttons = 0)     ' until releaseπ  IF mflg.menu = 0 THEN                          ' perform doubleclickπ    start# = TIMERπ    DOπ      MsStatus buttons, dummy, dummyπ      now# = TIMERπ      IF now# - start# > .5 THENπ        FUNCTION = 0π        EXIT FUNCTIONπ      END IFπ    LOOP UNTIL buttons = 1π    ReleaseButtonsπ  END IFπ  FUNCTION = %ENTERπEND FUNCTIONππSUB ReleaseButtonsπ  DOπ    MsStatus buttons, dummy, dummyπ  LOOP UNTIL buttons = 0πEND SUBππSUB ReadAndDisplayFilesπ  temp$ = DIR$("\DOS\*.*")π  DO WHILE LEN(temp$)π    INCR countπ    hwmany = countπ    FileName(count) = LEFT$(temp$ + SPACE$(12), 12)π    IF count = UBOUND(FileName) THEN          ' if there are more than 60π      EXIT DOπ    ELSEπ      temp$ = DIR$π    END IFπ  LOOPπ  ARRAY SORT FileName()π  COLOR 15, 0π  FOR count = 1 TO 20π    IF count > hwmany THEN EXIT SUBπ    LOCATE count + 2, 2 : PRINT FileName(count);π    FOR cell = 2 TO 13                        ' len(filename) = 12π      matrix (count + 2, cell) = count + 256  ' no asciiπ    NEXTπ  NEXTπEND SUBππSUB SelectFilesπ  column = 2π  options = 20π  ScrollMenu 0, FileName(), column, options, %ALTF, resultπ  MsCursorOffπ  IF result = 0 THEN EXIT SUBπ  COLOR 7, 0π  LOCATE 25, 1π  PRINT "You selected: ";FileName(result);π  DOπ  LOOP UNTIL LEN(INKEY$)π  RestoreMainπEND SUBππSUB RestoreMainπ  DEF SEG = &HB800π  POKE$ 160, MainScreenπ  DEF SEGπEND SUBππSUB ScrollMenu(last, item$(), column, options, exclude, result)π  IF mflg.menu THENπ    result = last - 1π    IF result <= 0 THENπ      result = 0π      MsLocate 3, 5π    ELSEπ      MsLocate result + 2, 5π    END IFπ    MsRow = 1 : plus = 2π  ELSEπ    MsLocate 3, 5π    MsRow = 3 : plus = 0π  END IFππ  DEF SEG = &HB800                         ' assume color cardπ  MenuScreen$ = PEEK$(160, 3840)π  DEF SEGπ  MsSetWindow MsRow, column - 1, options + plus, LEN(item$(1))π  init = %YESπ  DOπ    MsCursorOnπ    IF init AND mflg.menu THENπ      init = %NOπ      KeyIn = %DOWNπ    ELSEπ      KeyIn = ScrollMouseπ    END IFππ    SELECT CASE KeyInπ      CASE %UPπ        DECR resultπ        IF result < 1 THEN result = optionsπ      CASE %DOWNπ        INCR resultπ        IF result > options THEN result = 1π      CASE %HOMEπ        result = 1π      CASE %ENDKEYπ        result = optionsπ      CASE %ESCAPEπ        result = 0π        EXIT DOπ      CASE excludeπ        result = 0π      CASE 257 TO 276π        ' mouse only!π        result = KeyIn - 256π    END SELECTπ    IF result THENπ      MsCursorOffπ      DEF SEG = &HB800π      POKE$ 160, MenuScreen$π      DEF SEGπ      IF mflg.menu THEN COLOR 7,0 ELSE COLOR 0, 7π      LOCATE result + 2, columnπ      PRINT item$(result)π    END IFπ  LOOP UNTIL KeyIn = %ENTER AND result          ' safety firstπ  MsCursorOffπ  RestoreMainπEND SUBππSUB MainMenuπ  DOππ    IF choice THENπ      KeyIn = choiceπ      choice = 0π    ELSEπ      KeyIn = ScrollMouseπ    END IFππ    ' modified = %NOπ    SELECT CASE KeyInπ      CASE %ALTXπ        MsCursorOffπ        COLOR 7, 0π        CLSπ        SYSTEMπ      CASE %ALTFπ        FileMenu choiceπ    END SELECTπ    MsCursorOnπ    MsSetWindow 1, 1, 25, 80π  LOOPπEND SUBππCLSπ  MenuMatricesπ  DrawMenuBarπ  ReadAndDisplayFilesπ  DEF SEG = &HB800π  MainScreen = PEEK$(160, 3840)π  DEF SEGπ  MousInitπ  MsLocate 1, 1π  MsCursorOnπ  MainMenuπENDπAndrew Coggins                 PB NETBIOS                     rjohnso6@ix.netcom.com         09-01-96 (22:19)       PB                     430  19811    NETBIOS.BAS '==============================PBNETBIO.BAS================================π'This is public domain stuff, use at your own risk, etc. To test the useπ'of the NetBios commands used to receive and send broadcast messages overπ'a network. This sends ONE 80 character message to the other machine eachπ'time you hit "S" You must have registered an new name (and know itsπ'number) in the local name table before you can use the broadcast stuff.π'This is true for NetBIOS over NetBEUI in a DOS VDM in OS2 PEER. You mayπ'can avoid having to create a name in true DOS/NOVELL stuff. I don't haveπ'that so I can't test it. You only have to add a name once for your processπ'to use it many times. (You should probably delete it when you finish yourπ'process because the name table is finite , but OS2 deletes it for meπ'when I close the VDM so I don't worry about it. (I can't say enough goodπ'about OS2's accurate simulation of DOS (unlike Windoze XX)))ππ'This does not check for the presence of aπ'network. PB BBS has an example already that does that (PBLANT.ZIP).π'Another usefull document is Tom Thompson's NetBios Programmers Referenceπ'(1988 is the latest version I have) also on the PB BBS. This is meantπ'mostly as an example of how to set up and talk to the NetBIOS (and as aπ'result, the other computers). It wasn't meant to do anything useful, butπ'if you run it on 2 computers when you hit the "S" key on one you'll seeπ'a string pop up on the other. I recommend single stepping if you want toπ'see what is going on.ππ'The basic operation of the program is:π'  1. Establish a name and get its number in the local name tableπ'  2. Go into Receive (no wait) mode (listen for broadcast from others)π'  3. Wait on local user (You) to hit "S" or ESC (to quit)π'  4. Upon S-key, cancel Receive, issue Send Broadcast, reissue Receiveπ'  5. Upon any receive, print what was received, and reissue receive.ππ'OBTW - my name is Andy Coggins - I can be reached atπ'rjohnso6@netcom.com. I am in the discovery phase w/ this stuff myself.π'But I could find NOTHING on this on ANY board/net/ftp/www so I decidedπ'to send this up because it worked as intended and maybe it will helpπ'somebody out. If you have anything that expands on this please let meπ'know or post to the PowerBASIC site (support@powerpasic.com).π'======================================================================π%FLAGS = 0          'constants for register namesπ%AX    = 1π%BX    = 2π%CX    = 3π%DX    = 4π%SI    = 5π%DI    = 6π%BP    = 7π%DS    = 8π%ES    = 9ππ'establish the Network Control block Type (64 bytes)πTYPE NCBTypeπ  cmd AS BYTE             ' 1-command codeπ  rcode AS BYTE           ' 1-return codeπ  lsn AS BYTE             ' 1-Local Session Numberπ  locnum AS BYTE          ' 1-my name # in local name table (1)π  iobuff AS DWORD         ' 4-FAR Pointer to I/O Bufferπ  bufflen AS WORD         ' 2-length of data in bufferπ  callname AS STRING * 16 ' 16-remote system to callπ  locname AS STRING * 16  ' 16-network name of local machineπ  rectimout AS BYTE       ' 1-Recieve Time Out in 1/2 Secondsπ  sentimout AS BYTE       ' 1-send Timeout in 1/2 secondπ  inthandl AS DWORD       ' 4-FAR Pointer to Post routine handler (0:0)π  cardnum AS BYTE         ' 1-Network Adapter number to execute commandπ  cmd_ccode AS BYTE       ' 1-Command Completion codeπ  dum AS STRING * 14      ' 14-reserved for use by Network Card OnlyπEND TYPEππ'Initialize the NCB to all 0's (I assume they mean nulls in strings)π'You are supposed to clear the NCB each time you issue a new commandπ'(or use a different NCB)π'this should happen upon creation of the variable, so just copyπ'what was created and that is my init valueπDIM ncb AS SHARED NCBType               'working variableπDIM ncbinit AS SHARED NCBType           'initiazation valueππnetname$ = "DELL 486-50"     'a unique name to add to the name tableππMAP iobuff$$ * 512         'use 512 buffer for broadcast messagesπDIM buffaddr AS SHARED BYTE PTR          'pointer for string dataπbuffaddr = STRPTR32(iobuff$$)    '32bit address of data itselfπππCLSπ'add unique name to name table and get the number returned byπ'NetBIOS.πncb = ncbinit               'clear the Network Control BlockπPRINT "Adding Name will take approx 10 seconds (why, I don't know)"πCALL NCBAddName (ncb, netname$, xcode%)πIF xcode% THENπ  hexxcode$ = RIGHT$("00"+HEX$(xcode%),2)π  PRINT "We have a NetBIOS error - AL = ";hexxcode$;" (hex)  ";xcode%;" decimal"π  GOTO End.NTTestπELSEπ  PRINT "ADD Name was sucessful"π  PRINT "The Name ADDED was - ";ncb.locnameπ  PRINT "The Name NUMBER for this name is - ";ncb.locnumπ  namenum? = ncb.locnum            'this is # to use for broadcast cmdsπEND IFπππncb = ncbinit               'must do to enter a commandπrxcnt% = 0: txcnt% = 0      'just some status countersππ'set up receive mode on each computerπCALL NCBRcvBroadcast (ncb, buffaddr, namenum?, xcode%)π'CALL PrintNCB(ncb)              'just for testingπIF xcode% THENπ  hexxcode$ = RIGHT$("00"+HEX$(xcode%),2)π  PRINT "We have a NetBIOS error - AL = ";hexxcode$;" (hex)  ";xcode%;" decimal"π  CALL PrintNCB(ncb)            'just to see what changed in the NCBπ  GOTO End.NTTestπEND IF                          'error code on exitππPRINT "Hit (S)end to send a broadcast, ESC to stop the program"π'This is the main program loopπchoice$ = ""πWHILE choice$ <> CHR$(27)π  choice$ = INKEY$π  choice$ = UCASE$(choice$)π'  choice$ = "S"              'for single step testingπ  IF choice$ = "S" THENπ    'cancel receive commandπ    CALL NCBCancel (ncb, xcode%)π'    CALL PrintNCB (ncb)π    IF xcode% THENπ      hexxcode$ = RIGHT$("00"+HEX$(xcode%),2)π      PRINT "We have a NetBIOS error - AL = ";hexxcode$;" (hex)  ";xcode%;" decimal"π      CALL PrintNCB(ncb)            'just to see what changed in the NCBπ      GOTO End.NTTestπ    END IF                        'xcode%ππ  'initiate send commandπ    INCR txcnt%π    ncb = ncbinit                      'reinitialize ncbπ    'use a dummy dynamic string (so you will know its length)π    'change the string each time so you can see some progressπ    iobuff$ = STRING$(80, LTRIM$(STR$(txcnt% MOD 10)))π    CALL NCBSendBroadcast (ncb, buffaddr, namenum?, iobuff$, xcode%)π'    CALL PrintNCB (ncb)π    IF xcode% THENπ      hexxcode$ = RIGHT$("00"+HEX$(xcode%),2)π      PRINT "We have a NetBIOS error - AL = ";hexxcode$;" (hex)  ";xcode%;" decimal"π      CALL PrintNCB(ncb)            'just to see what changed in the NCBπ      GOTO End.NTTestπ    ELSEπ      PRINT "Broadcast packet number - ";txcnt%π      PRINT iobuff$                'print what you sentπ      'reissue receive commandπ      ncb = ncbinitπ      CALL NCBRcvBroadcast (ncb, buffaddr, namenum?, xcode%)π      IF xcode% THENπ        hexxcode$ = RIGHT$("00"+HEX$(xcode%),2)π        PRINT "We have a NetBIOS error - AL = ";hexxcode$;" (hex)  ";xcode%;" decimal"π        CALL PrintNCB(ncb)            'just to see what changed in the NCBπ        GOTO End.NTTestπ      END IF                          'error code on exitπ    END IFππ  ELSE                                'choice$ <> "s"π    'check for received message in no wait modeπ    'print received messageπ    IF ncb.cmd_ccode = 255 THEN              '&HFF until completedπ      LOCATE 24,1π      PRINT "Waiting on Send Broadcast from other computer - ";waitcnt&;π      INCR waitcnt&π    ELSEIF ncb.cmd_ccode = 0 THEN        'receive was successfulπ      INCR rxcnt%π      LOCATE 10,1π      PRINT "Receive packet number - ";USING$("#######",rxcnt%);" From ";ncb.callnameπ      msg$ = LEFT$(iobuff$$, ncb.bufflen)π      PRINT msg$π      msg$ = ""π      'reissue receive commandπ      ncb = ncbinitπ      CALL NCBRcvBroadcast (ncb, buffaddr, namenum?, xcode%)π      IF xcode% THENπ        hexxcode$ = RIGHT$("00"+HEX$(xcode%),2)π        PRINT "We have a NetBIOS error - AL = ";hexxcode$;" (hex)  ";xcode%;" decimal"π        CALL PrintNCB(ncb)            'just to see what changed in the NCBπ        GOTO End.NTTestπ      END IF                          'error code on exitπ    ELSE             'we had some netbios error - never happened in my testπ      hexxcode$ = RIGHT$("00"+HEX$(ncb.cmd_ccode),2)π      PRINT "We have a NetBIOS error - AL = ";hexxcode$;" (hex)  ";xcode%;" decimal"π      CALL PrintNCB(ncb)            'just to see what changed in the NCBπ      GOTO End.NTTestπ    END IF                         'ncb.cmd_ccodeπ  END IF                         'choice$ = "s" or notπWENDππEnd.Nttest:πPRINT "The program is finished - I hope you enjoyed this as much as I did"πENDπ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''π'Below are the Network generic routines.π'A routine to dump the Network Control Block to the ScreenπSUB PrintNcb (ncb AS NCBType) LOCALπ  PRINT "This is the value in each NCB field"ππ  PRINT "cmd = ";         ncb.cmdπ  PRINT "rcode = ";       ncb.rcodeπ  PRINT "lsn = ";         ncb.lsnπ  PRINT "locnum = ";      ncb.locnumπ  PRINT "iobuff = ";      ncb.iobuffπ  PRINT "bufflen = ";     ncb.bufflenπ  PRINT "callname = ";    ncb.callnameπ  PRINT "locname = ";    ncb.locnameπ  PRINT "rectimout = ";  ncb.rectimoutπ  PRINT "sentimout = ";  ncb.sentimoutπ  PRINT "inthandl = ";   ncb.inthandlπ  PRINT "cardnum = ";    ncb.cardnumπ  PRINT "cmd_ccode = ";  ncb.cmd_ccodeπ  PRINT "dum = ";        ncb.dumππ  IF ncb.bufflen <> 0 THENπ    DIM x AS BYTE PTR                 'handle string 1 byte at a timeπ    x = ncb.iobuff             'transfer 32bit address of message bufferπ    FOR count% = 1 TO ncb.bufflen  'read msg buffer 1 byte at a timeπ      inchar$ = CHR$(@x)           '@z points to an ASCII byteπ      msg$ = msg$ + inchar$      'build a string for viewing in IDEπ      INCR x                       ' increment the pointer itselfπ    NEXT count%π    PRINT "|" + msg$ + "|"π  END IF                          'anything in the io buffer?πEND SUB                           'PrintNcbπ'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''π'display the NCB Status stuff. I got junk for the most of these, but thatπ'could be because of OS2's virtualization (or it could be me taking itπ'apart wrong) I only wanted to look at the name table and I got that partπ'right. If you want to get the rest of the status fields correct youπ'need better documentation than I have. If you correct it, feel free toπ'just replace this post w/ the correct stuff.π'This routine is not called in this program.πSUB DispNcbStatus (ncb AS NCBType, a$$) LOCALπ'a$$ is the global message buffer iobuff$$π'take apart the message buffer returned by the &H33 command to NetBiosπ'ie. show me satus of thingsπDIM y AS BYTE PTR        'a local byte pointer to walk down the string withπy = ncb.iobuff           'same as STRPTR32(a$$)ππnamerows% = (ncb.bufflen - 60)\18πDIM Locname$(1:namerows%, 1:3)        'table for local namesππ'there is probably an easier way to do this, but I don't need it,soπ'I didn't spend time thinking about it.πnodename$ =               GimmeHex$(a$$, 1, 6)πjumpstat$ =               GimmeHex$(a$$, 7, 1)πpost$ =                   GimmeHex$(a$$, 8, 1)πversion$ =                GimmeHex$(a$$, 9, 2)πminrun$ =                 GimmeHex$(a$$, 11,2)πcrcerr$ =                 GimmeHex$(a$$, 13,2)πalignerr$ =               GimmeHex$(a$$, 15,2)πcoliderr$ =               GimmeHex$(a$$, 17,2)πaborterr$ =               GimmeHex$(a$$, 19,2)πtxpacket$ =               GimmeHex$(a$$, 21,4)πrcpacket$ =               GimmeHex$(a$$, 25,4)πtxretry$ =                GimmeHex$(a$$, 29,2)πrxnobuf$ =                GimmeHex$(a$$, 31,2)πdum1$ =                   GimmeHex$(a$$, 33,8)πfreencb$ =                GimmeHex$(a$$, 41,2)πlastresetncb$ =           GimmeHex$(a$$, 43,2)πmaxresetncb$ =            GimmeHex$(a$$, 45,2)πdum2$ =                   GimmeHex$(a$$, 47,4)πnumsess$ =                GimmeHex$(a$$, 51,2)πlastresetsess$ =          GimmeHex$(a$$, 53,2)πmaxresetsess$ =           GimmeHex$(a$$, 55,2)πmaxpacketsize$ =          GimmeHex$(a$$, 57,2)πnumnames$ =               GimmeHex$(a$$, 59,2)π'below are the local namesπFOR i% = 0 TO namerows%-1π  Locname$(i%+1, 1) = MID$(a$$, 61+(18*i%),16)                    'local nameπ  Locname$(i%+1, 2) = LTRIM$(STR$(ASCII(MID$(a$$, 77+(18*i%),1)))) 'name #π  Locname$(i%+1, 3) = BinFmt$(ASCII(MID$(a$$, 78+(18*i%),1)),8)    'statusπNEXT i%πππPRINT "nodename$ = ";            nodename$;                          " ";πPRINT "jumpstat$ = ";            BimFmt$(VAL("&H"+jumpstat$),8);     " ";πPRINT "post$ = ";                VAL("&H"+post$);                    " ";πPRINT "version$ = ";             version$;                           " "πPRINT "minrun$ = ";              VAL("&H"+minrun$);                  " ";πPRINT "crcerr$ = ";              VAL("&H"+crcerr$);                  " ";πPRINT "alignerr$ = ";            VAL("&H"+alignerr$);                " ";πPRINT "coliderr$ = ";            VAL("&H"+coliderr$);                " ";πPRINT "aborterr$ = ";            VAL("&H"+aborterr$);                " "πPRINT "txpacket$ = ";            VAL("&H"+txpacket$);                " ";πPRINT "rcpacket$ = ";            VAL("&H"+rcpacket$);                " ";πPRINT "txretry$ = ";             VAL("&H"+txretry$);                 " ";πPRINT "rxnobuf$ = ";             VAL("&H"+rxnobuf$);                 " "π'PRINT "dum1$ = ";                dum1$πPRINT "freencb$ = ";             VAL("&H"+freencb$);                 " ";πPRINT "lastresetncb$ = ";        VAL("&H"+lastresetncb$);            " ";πPRINT "maxresetncb$ = ";         VAL("&H"+maxresetncb$);             " "π'PRINT "dum2$ = ";                dum2$πPRINT "numsess$ = ";             VAL("&H"+numsess$);                 " ";πPRINT "lastresetsess$ = ";       VAL("&H"+lastresetsess$);           " ";πPRINT "maxresetsess$ = ";        VAL("&H"+maxresetsess$);            " ";πPRINT "maxpacketsize$ = ";       VAL("&H"+maxpacketsize$);           " ";πPRINT "numnames$ = ";            VAL("&H"+numnames$);                " "πPRINTπPRINT " LOCAL Name Table follows"π'below are the local namesπFOR i% = 0 TO namerows%-1π  PRINT "Name = ";Locname$(i%+1, 1);                                 " ";π  PRINT "NameNum = ";Locname$(i%+1, 2);                              " ";π  PRINT "Status = ";Locname$(i%+1, 3);                               " "πNEXT i%ππEND SUB                                    'DispNcbStatusπ'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''π'to look at the binary representation of a value (from PB3 help)πFUNCTION BinFmt$(value&,size%) ' returns a binary string of size% digitsπ  BinFmt$ = RIGHT$("000000000000000"+BIN$(value&),size%)πEND FUNCTION                         'BinFmt$π'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''π'not used in this program (used by the DispNcbStatus routine)πFUNCTION GimmeHex$(a$$, start%, length%)π  'since y is pointing to 1st byte already, we want to hand it a start% = 1π  '(like MID$) but we don't want to add 1 to it. If we want it to start atπ  'position 7 we want to add 6 to it.π  DIM y AS BYTE PTRπ  y = STRPTR32(a$$)ππ  INCR y, start%-1π  FOR i% = 1 TO length%π    a$ = a$ + RIGHT$("00"+HEX$(@y),2)π    INCR yπ  NEXT i%π  FUNCTION = a$πEND FUNCTION                          'GimmeHex$π'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''π'just to consolidate code the call and the associated return valueπ'are passed to and from this routineπSUB CallNcb (ncb AS NCBType, rcode%) LOCALπncbseg?? = VARSEG(ncb)                  'find our typed var in memoryπ'ncbseghex$ = HEX$(ncbseg??)πncbofs?? = VARPTR(ncb)π'ncbofshex$ = HEX$(ncbofs??)ππREG %ES, ncbseg??πREG %BX, ncbofs??πCALL INTERRUPT &H5CπAL?? = REG(%AX) AND &H00FFπrcode% = AL??                  'AL = 0 means no errorππEND SUB                                'Call Ncbπ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''π'not used in this routineπSUB CheckAddapterStatus (ncb AS NCBType, buffaddr AS DWORD, rcode%) LOCALππncb.cmd = &h033                        'send a broadcast in wait modeπncb.cardnum = 0             'send message from 1st network card in machineπncb.callname = "*"                     'use my local call nameπncb.iobuff = buffaddr                  '32 bit address of the msg bufferπncb.bufflen = 512                      'length of the message bufferππCALL CallNcb (ncb, rcode%)ππEND SUB                                  ' CheckAddapterStatusπ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''π'add a name to the local name tableπSUB NCBAddName(ncb AS NCBType, addname$, rcode%) LOCALπncb.cmd = &H030            'add name command - wait modeππncb.cardnum = 0             'use 1st network card in machineπncb.locname = addname$     'name to addππCALL CallNcb (ncb, rcode%)ππEND SUB                                  'NCBAddNameπ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''π'delete a name from the local name tableπSUB NCBDeleteName(ncb AS NCBType, delname$, rcode%) LOCALπncb.cmd = &H031            'delete name command - wait modeππncb.cardnum = 0             'use 1st network card in machineπncb.locname = delname$ππCALL CallNcb (ncb, rcode%)ππEND SUB                                  'NCBDeleteNameπ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''π'set up to receive, use no wait mode so you can do other thingsπ'like get operator input. (you can keep checking forπ'ncb.cmd_ccode <> &HFF to see if you received anything)πSUB NCBRcvBroadcast(ncb AS NCBType, buffaddr AS DWORD, namenum?, rcode%) LOCALπ'ncb.cmd = &H023            'receive command - wait modeπncb.cmd = &H0A3            'receive command - nowait modeππncb.cardnum = 0             'use 1st network card in machineπncb.locnum = namenum?       'my number in local name tableπncb.iobuff = buffaddr      '32 bit address of the msg bufferπncb.bufflen = 512          'default (max) length of the message bufferππCALL CallNcb (ncb, rcode%)ππEND SUB                                  'Receive Broadcastπ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''π'send a broadcast to EVERYBODY that has any kind of receive broadcastπ'issued (I'm sure this could screw up some complex programs)πSUB NCBSendBroadcast(ncb AS NCBType, buffaddr AS DWORD, namenum?, iobuff$, rcode%) LOCALπSHARED iobuff$$πncb.cmd = &H022            'send command - wait modeππncb.cardnum = 0             'use 1st network card in machineπncb.locnum = namenum?      'my position in local name tableπncb.iobuff = buffaddr      '32 bit address of the msg bufferπiobuff$$ = iobuff$πncb.bufflen = LEN(iobuff$)    'length of the message to sendπππCALL CallNcb (ncb, rcode%)ππEND SUB                                  'Send Broadcastπ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''π'must cancel an unfinished command issued by a ncb before usingπ'THAT ncb for another command (you wouldn't believe how things bombedπ'when I didn't cancel receive before I tried to send)π'I used wait mode (it was instantaneous)πSUB NCBCancel(ncb AS NCBType, rcode%) LOCALπncb.cmd = &H035            'cancel command for this ncb - wait modeππncb.cardnum = 0             'use 1st network card in machineππCALL CallNcb (ncb, rcode%)π'I think OS/2 returns a 24h (36) (command competed before could cancel) toπ'cancel a receive broadcast command, so I will treat this as no error.πIF rcode% = 36 THEN rcode% = 0πEND SUB                                  'NCBCancelπ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''πRyan White                     R-RAD TYPER                    BIGFOOT@InfoAve.Net            09-21-96 (17:53)       QB, QBasic, PDS        131  3934     KRAD.BAS    'Rrad typer...  Kinda like krad, only made by me so I can understand it.π'By Ryan Whiteπ'Feel free to change and mess with it.π'Suggested edits: make colors 1-15 more intense with out-commands, put in aπ'                 text menu like interface, make the characters where U canπ'                 read them your way, make it where you type a normal page,π'                 and the program converts the page to Rrad.π' Warning to newbies  DONT use ASC #'s 0 to 32!!!   Just dont.πSCREEN 0, 0, 0, 0πCLSπWIDTH 80, 50πCOLOR 15, 0πON KEY(1) GOSUB chngcol: KEY(1) ONπON KEY(2) GOSUB clr: KEY(2) ONπON KEY(3) GOSUB redo: KEY(3) ONπON KEY(4) GOSUB enditnow: KEY(4) ONπPRINT "This is R-rad typer.    Just type the letter and it's done."πPRINT "Commands: Press F1 to change colors, F2 to clear screen, F3 to restart,"πPRINT "and F4 to quit.  ****  To get the effect of pressin enter.. you must type"πPRINT "an appostrophe(`)  The thing next to the 1.": PRINTπINPUT "Enter new filename and extension:", fle$πOPEN fle$ FOR OUTPUT AS #1πCLSπst:πDOπAns$ = INKEY$πLOOP UNTIL Ans$ <> ""πIF col >= 75 THEN col = 0: PRINT : PRINT #1,πSELECT CASE UCASE$(Ans$)π CASE "A"π  PRINT "Æ"; : PRINT #1, "Æ"; : col = col + 1π CASE "B"π  PRINT "ß"; : PRINT #1, "ß", : col = col + 1π CASE "C"π  PRINT "<"; : PRINT #1, "<"; : col = col + 1π CASE "D"π  PRINT "|)"; : PRINT #1, "|)"; : col = col + 2π CASE "E"π  PRINT "Σ"; : PRINT #1, "Σ"; : col = col + 1π CASE "F"π  PRINT "ƒ"; : PRINT #1, "ƒ"; : col = col + 1π CASE "G"π  PRINT "G"; : PRINT #1, "G"; : col = col + 1π CASE "H"π  PRINT "]-["; : PRINT #1, "]-["; : col = col + 3π CASE "I"π  PRINT "│"; : PRINT #1, "│"; : col = col + 1π CASE "J"π  PRINT "⌡"; : PRINT #1, "⌡"; : col = col + 1π CASE "K"π  PRINT "]<"; : PRINT #1, "]<"; : col = col + 2π CASE "L"π  PRINT "£"; : PRINT #1, "£"; : col = col + 1π CASE "M"π  PRINT "/\/\"; : PRINT #1, "/\/\"; : col = col + 4π CASE "N"π  PRINT "ⁿ"; : PRINT #1, "ⁿ"; : col = col + 1π CASE "O"π  PRINT "()"; : PRINT #1, "()"; : col = col + 2π CASE "P"π  PRINT "₧"; : PRINT #1, "₧"; : col = col + 1   'just imaging the t wasn't thereπ CASE "Q"π  PRINT "q"; : PRINT #1, "q"; : col = col + 1π CASE "R"π  PRINT "Γ"; : PRINT #1, "Γ"; : col = col + 1π CASE "S"π  PRINT "$"; : PRINT #1, "$"; : col = col + 1π CASE "T"π  PRINT "╤"; : PRINT #1, "╤"; : col = col + 1π CASE "U"π  PRINT "ü"; : PRINT #1, "ü"; : col = col + 1π CASE "V"π  PRINT "\/"; : PRINT #1, "\/"; : col = col + 2π CASE "W"π  PRINT "\/\/"; : PRINT #1, "\/\/"; : col = col + 4π CASE "X"π  PRINT "><"; : PRINT #1, "><"; : col = col + 2π CASE "Y"π  PRINT "¥"; : PRINT #1, "¥"; : col = col + 1π CASE "Z"π  PRINT "z"; : PRINT #1, "z"; : col = col + 1π CASE "!"π  PRINT "¡"; : PRINT #1, "¡"; : col = col + 1π CASE "?"π  PRINT "¿"; : PRINT #1, "¿"; : col = col + 1π CASE "1"π  PRINT "I"; : PRINT #1, "I"; : col = col + 1π CASE "2"π  PRINT "II"; : PRINT #1, "II"; : col = col + 1π CASE "3"π  PRINT "III"; : PRINT #1, "III"; : col = col + 1π CASE "4"π  PRINT "IV"; : PRINT #1, "IV"; : col = col + 1π CASE "5"π  PRINT "V"; : PRINT #1, "V"; : col = col + 1π CASE "6"π  PRINT "VI"; : PRINT #1, "VI"; : col = col + 1π CASE "7"π  PRINT "VII"; : PRINT #1, "VII"; : col = col + 1π CASE "8"π  PRINT "VIII"; : PRINT #1, "VIII"; : col = col + 1π CASE "9"π  PRINT "IX"; : PRINT #1, "IX"; : col = col + 1π CASE "0"π  PRINT "º"; : PRINT #1, "º"; : col = col + 1π CASE "`"π  PRINT : PRINT #1, : col = 0π CASE "."π  PRINT "."; : PRINT #1, "."; : col = col + 1π CASE " "π  PRINT " "; : PRINT #1, " "; : col = col + 1πEND SELECTπGOTO stππchngcol:πc = INT(RND * 15) + 1πCOLOR cπRETURNπclr:πCLS     'WOWπRETURNπredo:πCLOSE #1πOPEN fle$ FOR OUTPUT AS #1πCLS : PRINT "Filename is empty..."πPRINT "Type on...": PRINT : PRINTπRETURNπenditnow:πCLOSE #1πPRINT "Done editing.  "; fle$; "is alive now.   Have fun.  Byebye"πENDπKurt Kuzba                     FAST GET/PUT TEXT              FidoNet QUIK_BAS Echo          09-24-96 (00:00)       QB, PDS                105  6894     GPTXT.BAS   DEFINT A-Z:DIM SHARED K,S,B&,Z&:V1 'Created by PostIt! 7.2πSUB V1:OPEN "O",1,"GPTXT.ZIP",4^6:Z&=4898:?STRING$(50,177);πU"%up()%9%%%R-%=d7qFg\6+GF'.%%k(%%%.%%%%lu(y'yS#tgoD&atm9mvA#8q>EπU"ofleesTe99GI3<5_v<W3buQth<Q9gSg]CMahD%MmGm\pho[H>bnCJaUr\$'lab.πU"J-QGf5mVw8kIcEYIQ<1[pQs82lE%.nIU8ruwWhp3WKNDE_p3<Zsw-L?lgr#>']9πU"pYe/)KR.uLT:q%FIEF3U,<AfEe8yyKiPA==;tT\jK3q?yUOy[h;)Y3MCO\#Z(dTπU"JP^7fiEVHLG:<.X$5+6f<ZyVj=[hfUm0-HapYy.kxJrJIXp%ma2ZCA:;vg\v%HYπU"hz2y(iSQmcd&gi(T;_<1j<9IwQ,)qpTVzUODz1ZQmM$'=I'B9Ue]*P$0vx'1I(TπU"UU7+xbQSe_9B2(b[fQ,f:1?cW&N,ou>1g=dJlSJ+WZ#_MA/&LH/NY1Kc+[&RlM=πU"Adp+Gr6[8+j6bK/90BViE/0'+8L92jTc-Ml5Ax3d(a#l939skj68E/i/hw4&Hh/πU"h?_.740hK:0;qum_9fwic>p0k52l?Ss<#xN6NN,I&Z0/^3,,_4'n.C8fVdp<5e&πU"ytIp7qsYQd5wfBZ/BzM0;E(-C_*p*:)\r&H6AJ2IU0E/V=a]MT#wG2T=/N^1-AnπU"*aoa&roX7#.8gn2le5#^EHzDr\NFjxGTM'A()aSRB\5wjR,NSS-Zr_lB7S\K=j9πU"Q/I+UPHcsg1Qt(__2YjPOXoOBgZ>qBun[(Fle5b*r^arGB:.bwiHXO4izmWI&CcπU"OpK,>>=%fSyG>MIgy)sX]OSXNG8uqtjb1F8Wkr)]QXk=:8Q0-==]wI?F]xj<iXvπU"EKbrAlF2Y1j[*CNa'#Dup%()9%%%%-%*\dqFTpCRe'32%%'N:%%%.%%%#luy'%yπU"SvqOgfgJACyze$?FzVW3d'c^FR=b[1KR<XiSQw%N*F8(3H:5#hmw_C/_s(\HfE(πU"H'3:Kq1oSOGGbeR/R=D;%'_S98*-V8RCh^P1+XVV]I-F/OGS)pD7if-WK(MKHpMπU"*+fwXNHe)xxXlvoHfbBoc$iWj3G9;5vX/xYRG'qAX6YLjY<N-TaW]Ae8bbgb&iCπU"-g&5&Pgu/%C(pe^8GA-SO<9)0)6;';>Rpf+La&L3:8?&\+(k<%VxG=a4g*L7e;AπU"(E>/Fw.%pP<Ia.%Pa<:[)+8e&b'Y5].^sR0929S>UaCU0K09Y_*BkeV'7-O9wBYπU"*tQazYj)j3-RF8/#Q.EoOC?%-A&L?:PYQB1-kOe3_5+/PV/A8g%g(14PN&[^EDEπU"1(4o/'M&*aC2M2%VRf9://PG<oe't9+&iVU1FN#E(C[+.n/A)K,0MDk*V0xXsJKπU"<]5tb/;.M':2GX-6;g'>RpIfL'WH/41-]CWKK\zE-sN9nO;LosI?+5AwGfV&i9_πU"NQCie[^$wlxlNl^X.b4lk%\sdAHSD>DcUBgty2-S)W_2Z&2N#u..]Sn=(c[3MaGπU"v26?+2B%=rM4^)11(N2(P2;s[3Q%)a140%WFa*nWrktZd-.[w/zXBOVThC4GY,cπU":V74N)x3Dj)5bbIierWNO\yLVtDc*c_xB3Oj40ak-_%B<xUv6&N#V,k%_S^3kwDπU"jlMQdeu8<VUNy^%W$W\qicWhcu1qmY=o#AKAY]UrOaN0L9?Y5dYqw^f5V[rVc?xπU"]?>jjuELkz)104:2A6r&P:$j)QHY7*A$_Qgs=KKEZ/OUh\DSgQ&]WDgpVG4%p=GπU"DAG]qg%#rP?k\%NNqek7D]&lAC7682#k&B_fv_G*X[hk]QxBk0F];ykqw(fV&bLπU"brG$x+:_7xm&Dp#\FI.2<RtShd$TIwM61j3vL4sEJ3LM0JohTK^UdapmLZA\LY\πU"5=='hgGGGbHvX_zwUncDOn$.MGn,B0#Gb59e7AOSLAD/5Bm,dJnTh/*hzH\<h#eπU"=hcJ*WT24ckSm=XPwm->ZesfM4N6v^]5SASFCwpAueI3k,-SpTF2x,DXqGaG(MrπU"H[kr<kJt0Ca)q3CEG<a_LGZ<(K-uDSiNMdL68jw]]w>dV$m^Bk92:LaMhZgWAsEπU"v3H^P878YKrH8^9Z>\*9\J\)&rPm9-wE:YFwqx&:uqiL$'oqZ4h'/1ST41QS%/hπU"F^*<9g8C*\MH5L:[tvi4'$Y7/8K^/]p0iK&UtP;f'$Y'/8']/Kw-1F:AFlZ<+]:πU"I/(/A*NkB<tj+c:jY%ReKI?IbITUA:E88TQ22fAUpHJkXGSiaiVPb1?rzriPG,#πU"di:h-qFTk'upB+:+m&nVSU\%U5eb#+lk$(8Bo$cc]\16.2+%6?pzf->D77r_j1>πU"p$<'>*>R;K.l:yb[MR>$uKNx&X)?0tN4.wB&xpBfj>NgyvYMZUNANvfV[BSqWIoπU"=3ZOGJOmMDBnhEKQ$;$>52v/YmX*,SMNoWlklqI^Z)yQ.KDteS>qCPYhKcmUuWOπU"dVuMK;rF7)tn2'P]f^KJPXPdf,j;V#YN%SB[fJ8F1YZMH?\f]FG?;ojk[T*3AKcπU".Dcoc[/)UnMLVp;Fob+p8RD3bj8I:OC/L&rtlq)0C6lBudjbl,vQoFkJ;0#DonFπU"i>(K?6n(oF1yE,$o^kc);5CQUDBX0vr?x>YDPjjTF#)U<)g9x:TUhBP)?[;kqO$πU"kLO9n(2OvBF>SdTiV[xCVtE8Xkv]oT/>t-01D4Z8z,.x,EmIltjI2IFg_+LShTaπU"xa]nu4]DkIU>dglorG6_TUNB?+4>Cjyexx,4h?=HwgBnD0j[<;YiiX2+aaM&trCπU"l0o-AWS9\.KupGcgne4[Tu3lux?&od(R_#eJ494IMWn/YJ_HHgt;5R/0qY46SA2πU"_?ekrF*o]I;#.jKerEAe]QpDBib3pGZ48r=doP(2lKO#ONiyPlff_K*jPhIkx7)πU"83h-=SIEkA's:JS'i\nZH#_?dp0$4;9$oDr0$<kc?a?L%AvVbxq[eTSe5?FFE_FπU",I>ti2cB21\(MnKvP6AKZ)ULxL^:x/s5e$w7h1O;n%<P9UV/YBIrS$w8G5Mi\FWπU"]rfSBvW'JrL6QsE31Z,^U,xtdx4N07zsO8DbwJ53%eg)S9psYagf9/Q/8WooTd;πU"hX,BQP0Wg6v9*[\#c#-q]8w,flfo3q$d-obT0]F3y2lKkWi.X=2DL2QtZpYmERNπU"8MRkJ8sIswmp#A7H<^>S\NfaZgPEhjSH47h8=q%0<QO<f^?I>:vQmP/s&q5OZ8HπU"ZvoD1oh7-6nJxX43NRi1Z_rHWaRMGfk<XXnZpxqLrR8A$PFxoel,,kvtd,AvTY&πU"i/9t9uO7*H&b%8kdQhJJ--NcpE6rMGqEF[ZaIQE.Fv]x6a=$Ma=UY;,ue]I'a0oπU"<*c]gWitu7([s[sZ#Qc\WP.FqoAX]r9VKCrd4]<5,ff$gH$&;3xsm1*m]?=rSP\πU".n:;8TL$k],t=71'Lz9l6_;TDUlKgAU50v9fMkI49f76>dSw#xTZh<pxmLr\5sNπU"cJ/cgmPw_gxnt3AFJ]+fqA-n:d4kuYN5g\HnBaH>+8a?HmYFVV/idj^,?oF8Gk#πU"JE$62m]p\EHGRhkXbER3iGu?o(-6x^5j:(Kh6(k^YA_Y;:K6,]5jF(CM6^A%E9(πU"F6Cjk:BZ_]%SIX<6tSkRY;1F6Z]YzY%aT,OGyU^zZ;U.6.k4R^;>26DkZt?O=RTπU"(]lAc_\qZ6EH(XG6D^JYQ,X?Koa6zF^tR6e:]*DHRh]*HHRpk0vP6#g]Jh,h\k<πU"ZJ;P6>GAo;6ZxGREZGW\;(,6$^6dY;<q6NYeq^kf^e;D6Vkkn?OcDR&G=cYeh?GπU")XD,B?^$HER%6[l]$C3RvkBH$e)6hRkl]q;W,HF]tX6;nBo*_6v]tYa,LktL<R0πU";klZQcER^GLS?EXc,h^4&U8H&.XemHRV%B]5':<EO3urMsCh-L4Eo4%<u+TD$3lπU"o$q5dGF7RREOaRERFoGOFG1Rllz#_$\JEgk^BL03i0cxjF8Xhuu>8nXj]fEkNVGπU"GSlnr\Px3iovn^bDJ;6+?a8x[^_>aGSb3R)uvqS=vw?9XTm%-5NBcPBC+N)V>bCπU"S;]$g:)IfyE'mCN_2MacS2CicGdYlYGrpwm.*I1Nr0MTaK(.,Qb&Xdw19mPbV)RπU"e:H#bJb5qNlEm)QcK8hC\c*;(zXE<n2nk/Iza2P)t%XY)-sFks*E&qMfWW#N>jJπU"Z0mbvlSq^>(/[YMN.WMnIp[RufXo%Juh5Ww5Fbw=^Tjna5<_N8hi/%=u14EDgjHπU"QRFMmfBPhIx5bjIQ6)k>S<M)1MjOYx=B3SD<B:Z5uZ+4&\\Y>M_JcU5rmM*4M&<πU"a9,z9aklW;pj>_6Emm^mRsdxO,ll1uVtF+,whXxhf%NQmAHC#NF84iuxHFJGG7ZπU"FbYs0_o-)&ui6Hbi2:_&.?.BH/Lrc*SCsc#T1saNTYC+u:>pL^Wg6Nm5(uwpD3hπU"eNHqCXg#PztH)8-Nm^l6wFkPJJLb9X<3zIS<MMgT>]gkfu[I-vkxgHt]LSUC$TTπU")mcpjrx>^Pc=bZJ$X37s5FRU$a.x#*O5GaX23ZeVp8\KnUs,#(b1il0kX?*%IY%πU"lWTk6aLZ3W(zb,PN3jsLD3r'(3_fc_*P(gZilYplZ.TLj3%L-d7X.Js78csv.n=πU"ta3g9Pz3c_v:POH&vH0A\uGFMTF(tmwlgcE#zPj8zZ&zWA,hxn<E0(?B,5fhzCJπU"c;LZnKl0#.$dxa-F6%MzO8fQlNfDYr/OfBh,I'p>#WE#GCHHDRlj,4uBP*fz%q7πU"5g5DHwMkITiz&*5mK=s2w33TCJNdlDA(&lEH<'P=I+3a:HTAdRSU^6o]3z>IccOπU"he$2/6,1w-6[K3g(s5[zr1z6WHs?OA<]X//?puu7,^Pl8J=YIy05Iky4Zse\pj6πU"oq/ezH9I4'>w5Yoyhla;7i$PZc7HS>2ms_ZHrXi6,I7V^$b#_0X/pqB&0g6hyODπU"L/ur1[Tvs#fg?jE>Km#bb'o>drhs.W+u/pgk[w%3(y:e^ahG%daF).Y&jty,zmCπU"c]E20LQW)_4i0&8IV;s7yr/(,-Oas9nW%U4;oV4sPDXHu.-^<)\:?c?K\.8__+iπU"DZr0nC4.h[Yu%,;0XXm0r2JbuCJ.GDSg_f5##;t;'oODJe[I2>d9#:ix?x&XP;JπU"nI[MMTOzd*BazU--0*4]#aM-vOgnm\K7#M00bc0Z&%j#V5b(%pu64*2r'uG,C]9πU"Z&k&cmns(Q-1+C#pXSKrJ:om9qdu*lFQY%&0Ft#^&ncMMRO(Pj.,9Mb,UqIO,$cπU"_]wM_C3;4SBW$4m/HDbqsQrror9&CU;&5<X&72S8fU9<S5[E;)KBNLFpm8r-,$;πU"]N$$m>%FyULIXdN==[^WUmil5N=&72]VQhR^VaB:kZ%2rG,1v4u%p()9%%%%-4%πU"KdqLFK\\,z6&%%%h(%%%0%%%%ljy&.uzy%SgfxJdx,>Aje5KFl[d[5qQP+m6hf/πU"c1c(Y(0pFe*YkKt=;'(SAa(NkrttwqdC5;#atfF&qEVR2/l:kR]wY4=fj-,=DByπU"$E[Op,1G*'=G4.G93Wwd:2tkw]ASY:[<Vj%^ef$*zn^<\.tH/FP%<<Zbb9NH$H9πU"+?036m9Fu5%I>(B$jl'0[l%zG(:>:j-d<ob+]ZO3rF%Yt7wq-uBRcqT+2D9*/9KπU"*c[28qUS5J\NfVq-uw;n/T[Gu-J5_o's<_q;qIrCKP[1PlL5sBv)Fu]4MFEOCVwπU"pDqt,/r;p,LGDVvP/_:JpX&WNIxAY(k:$usl+wah66i)>_N8gxTl;74Njm.Gp=9πU"Ii.[X.+heSaj3>Y7(1I-N_slwm&dh9)Fr;9LLW+js7:P=9dN[i>7;6o#s:F#lW-πU"k\W.x7>TrF2vZ+M>CsM=geIIJma#NHzl,Y:$M&un,.A%Y46')Qpq4[>vPddE1c5πU":k?O&wLL'FGZqe0sjvh^zR7.b#+0?i1XeSBtYZ[hu?Rmbnn#pkK8aGtL8x<dp8pπU"op/>#;?.*(2kz&Jd(,n>Pt%#8C&.up&%'9%9%%%%-4%=dqaFg\+*GF'%(%k(%%%πU".%%%%%%%%%%%E%%%%%%%%%l.uy'y%Stgo%up&'%9%9%%%%-%*\dqFTpCRe'32%%πU"'N:%%%.%%%%%%%%%%%E%.%%m'%%%lu(y'yS%vqgu%p&'9%%9%%[%-%KAdqFKh\\πU"z6%&%%h%(%%0%%%%%%%%%&%%E%%(%N5%%%ljy&.uzy%Sgfx%up*+%%%%%%(%(%&πU"v%%%&47%%%%%πEND SUBπCLOSE:IF S=116AND B&=Z&THEN?" :) Ok!"ELSE?" :( Bad!πSUB U(A$):FOR A=1TO LEN(A$):C=ASC(MID$(A$,A))-37:IF C<0THEN C=91+C*32πIF K<4THEN K=C+243ELSE?#1,CHR$(C+(K MOD 3)*86);:K=K\3:B&=B&+1πS=(S+C)AND 255:NEXT:LOCATE,1:?STRING$(B&*50\Z&,219);:END SUBπKurt Kuzba                     FILE SEARCH TO FIND TEXT       FidoNet QUIK_BAS Echo          02-28-96 (00:00)       QB, QBasic, PDS        50   1947     FINDTEXT.BAS'>   I want to write a program that searchs through a fileπ'>   to find a specified string.  This program is prettyπ'>   common to those who want to test their programmingπ'>   knowledge, but I've never attempted it.π'>   I need suggestions/guidance.π'>........π'   How about a working example?π'_|_|_|   FINDTEXT.BASπ'_|_|_|   This program performs a fast file search for any givenπ'_|_|_|   text, selectively allowing case sensitivity.π'_|_|_|   Full overlapping is implemented for instances where theπ'_|_|_|   text might span the input buffer boundaries.π'_|_|_|   No guarantees or warrantees are given or implied.π'_|_|_|   Released to   PUBLIC DOMAIN   by Kurt Kuzba.  (2/28/96)πON ERROR GOTO OOpsπFileToSearch$ = "": COLOR 2, 0: CLS : LOCATE 3, 1πINPUT " Enter file name => ", FileToSearch$πIF FileToSearch$ = "" THEN CLOSE 1: ENDπINPUT " Enter text to find => ", text$πPRINT " Search case sensitive (y/n)? ";πIF text$ = "" THEN END:  ELSE L% = LEN(text$): Overlap$ = ""πDOπ   sensitive% = INSTR(" YN", UCASE$(INKEY$))πLOOP WHILE sensitive% < 2πPRINT MID$(" YN", sensitive%, 1)πIF sensitive% = 3 THEN text$ = UCASE$(text$)πOPEN FileToSearch$ FOR BINARY AS #1πPRINT TIME$πWHILE NOT EOF(1)π   test$ = Overlap$ + INPUT$(4096, 1): TL% = LEN(test$): strpos% = 0π   IF sensitive% = 3 THEN test$ = UCASE$(test$)π   WHILE strpos% < TL%π      found% = INSTR(strpos% + 1, test$, text$)π      IF found% THENπ         strpos% = found%π         PRINT "Text found at"; LOC(1) - LEN(test$) + found%;π         PRINT "   O>=* hit a key *=<O"π         WHILE INKEY$ <> "": WENDπ         k$ = "": WHILE k$ = "": k$ = INKEY$: WENDπ         IF k$ = CHR$(27) THEN CLOSE 1: ENDπ      ELSEπ         Overlap$ = RIGHT$(test$, L%): strpos% = TL%π      END IFπ   WENDπWEND: CLOSE 1πPRINT "end of file": PRINT TIME$: ENDπOOps:π PRINT " Disk error or bad file name ["; ERR; "]"π CLOSE 1: ENDπ'_|_|_|   end   FINDTEXT.BASπ 1         76   PSYCHIC-OLOGIST                Nathan Wittich                  1         153  CALCULATE WIND CHILL           Steve Horstmeyer                1         65   IMPORT ANSI INTO BASIC FUNCTIONKurt Kuzba                      1         244  LOADS 320X200X256 PCX IMAGES   Tony Jones                      1         20   XOR ENCRYPTION                 Scott Turchin                   1         70   CONVERT UNIX TIME STAMP        Andrew K. Dart                  1         311  SOUND BLASTER STARFIELD        Luke Molnar                     1         883  DIRECTORY LISTER               Alvin Williams                  25644     242  MISC. DETECTION ROUTINES       Ben Kaashoek                    1         252  VGA 640X480 PANNING            Douglas H. Lusher               8232      380  GUI LIBRARY V1.23 W/DOCS       Tika Carr                       1         92   SUBROUTINE & FUNCTION USAGE    Kurt Kuzba                      4597      342  GET/PUT INFO. FOR VGA MODE 13H Andrew L. Ayers                 1         853  VIDEO POKER                    Mike Kristopert                 20423     1282 RED BARON 2573                 Adam Stanchos                   67340     451  GAME MAPPING TECHNIQUE         Eric Blanding                   96780     280  PICTURE PUZZLE                 Robin Ohm                       105006    473  QBASIC ROCKWARS                Brennen Bearnes                 117950    492  STICK FIGHTER                  Brian Flanagan                  138782    317  QBASIC GAME DESIGN TUTORIAL    Andre van Wyk                   159559    102  GAME OF NIM                    Steven Anthony Morisi           162792    1767 LEGEND OF LITH 2 (RPG GAME)    Matt Zuchowski                  278039    639  WORMHOLE                       Brent P. Newhall                298124    498  JEWEL - LIKE COLUMNS           The ABC Programmer              1         261  GORAU SHADED POLYGONS          Luke Molnar                     5784      152  FAST 320X200X256 PCX VIEWER    Jonathan Leger                  11570     981  GRAPHICS LOADER UPDATE         Jonathan Leger                  38230     39   VORTEX                         Ryan White                      40753     80   COLOR MORPH                    Ryan White                      43767     131  FLYING BEES #2                 Ryan White                      48089     135  FLYING BEES #8                 Ryan White                      52625     142  FLYING BEES #9                 Ryan White                      57241     87   GEOMETRY SICKENER              Ryan White                      59741     93   GEOMETRY SICKER                Ryan White                      62395     82   3D GRAPHS                      Nathan Wittich                  65001     290  DEMO OF REAL-TIME GRAPHING     James N. Broadbent              74295     74   SPIRALING MIND KNOCKER         Ryan White                      77093     89   MULTI MORPH                    Ryan White                      79749     128  OUTLINED FONTS                 Phillip Jay Cohen               86220     617  MISCELLANEOUS GRAPHIC PROGRAMS Ryan White                      126430    56   PLASMA KALIDA THINGY-MAJIG     Ryan White                      129193    321  PANNING W/256 COLORS           Douglas H. Lusher               140745    301  VGA SCREEN SAVE/RESTORE FOR PB Don Schullian                   160460    241  FERN FRACTAL                   Erika Schulze                   176208    66   FALLING LEAVES SIMULATION      Dave Shea                       180590    409  TGA (UN/COMPRESS) VIEWER       Erika Schulze/Gunther Ilzig     207423    151  SCREEN 13 PAGE FLIPPING        Douglas H. Lusher               217347    55   FAST CLIP PUTTING              Joshua Dickerson                218794    177  STARFIELD SIMULATION           Ben Kaashoek                    226788    55   DEMYSTIFY SCREEN SAVER         Kurt Kuzba                      229446    74   SHOW ALL COMBINATIONS OF COLORSKurt Kuzba                      231698    276  ROTATING 3D CYLINDER & SPHERE  Douglas H. Lusher               240139    389  COMPLETE BLAST! (MODE 13H) SUBSAndrew L. Ayers                 252914    213  BLAST! MODE 13H GET ROUTINE    Andrew L. Ayers                 260795    179  BLAST! MODE 13H PUT ROUTINE    Andrew L. Ayers                 267724    71   BLAST! MODE 13H PSET ROUTINE   Andrew L. Ayers                 270149    102  BLAST! MODE 13H SPRITE ROUTINE Andrew L. Ayers                 273434    149  GET/PUT MANIPULATION ROUTINES  Andrew L. Ayers                 278440    49   FAST SPRITE DEMO               Andrew L. Ayers                 281695    76   EXPLOSIONS EFFECT              Andrew L. Ayers                 283414    89   FAST & SMOOTH SCROLLING EFFECT Andrew L. Ayers                 285502    148  QUADRATIC PLASMA               Andrew L. Ayers                 288851    146  EXPLODING PIECES EFFECT        Andrew L. Ayers                 292388    100  OTHER NICE SPECIAL EFFECTS     Andrew L. Ayers                 299011    84   MELTING SNOWMAN                Robert Seidel                   301530    61   BOUNCING WOODEN BALL           Mathew Robertson                1         93   VIEW CONTENTS OF RAM           Kurt Kuzba                      1         182  PICK LIST DEMO                 Charles Godard                  1         136  MOUSE DRIVEN TRIANGLE          Nicolas Culberson               5581      335  PARALLEL PORT TEST UTILITY     Marek Piotrowski                1         201  TERMINAL W/ANSI EMULATION      Kurt Kuzba                      7748      48   PHREAK FONE                    Brian Mahocker                  11328     127  BACKSPACE LOCALLY & OVER MODEM Scott Turchin                   1         400  MOUSE ROUTINES W/DOUBLE CLICK  Egbert Zijlema                  1         430  PB NETBIOS                     Andrew Coggins                  1         131  R-RAD TYPER                    Ryan White                      3969      105  FAST GET/PUT TEXT              Kurt Kuzba                      10923     50   FILE SEARCH TO FIND TEXT       Kurt Kuzba